簡體   English   中英

Java Generics - 參數類型和轉換

[英]Java Generics - argument type and casting

我有一個正在嘗試解決的 generics 問題。 我正在做一些手動鑄造,感覺就像我做錯了什么。 我對使用 generics 有點陌生,所以很可能我在某些方面濫用了它們。 一些指導將不勝感激。

TLDR:
我有一個帶有T參數的通用方法的接口。 我在 class 中實現了這個接口,但在實現者中我想確保T是特定類型(假設是Animal ,所以我可以提取一些字段)。 我怎樣才能做到這一點?


詳情
我在下面有一個接口Transformer ,以及一個實現 class 的接口,其中SpecialTransformer implements Transformer

Transformer有這樣的定義:

public interface Transformer
  public <T> Event transform(T input);

SpecialTransformer有這個定義:

public class SpecialTransformer implements Transformer

  @Override
  public <T> Event transform(T input) {
    Animal convertedInput = (Animal) input; // <------- This feels wrong

    String color = convertedInput.getColor();
    //Other field based logic
  

  }

與其將 generics 約束放在方法上,不如將約束放在接口(和類)上:

public interface Transformer<T> {
  Event transform(T input);
}

在 class 上,您可以將一個新的泛型類型限制為Animal及其子類(或實現):

public class SpecialTransformer<T extends Animal> implements Transformer<T> {

  @Override
  public Event transform(T input) {
    String color = input.getColor();
    //Other field based logic
  }
}

甚至直接使用Animal作為Transformer的類型:

public class SpecialTransformer implements Transformer<Animal> {

  @Override
  public Event transform(Animal input) {
    String color = input.getColor();
    //Other field based logic
  }
}

對方法的約束不能達到相同的效果,因為帶有簽名的方法<T> Event transform(T input)不能被<T extends Animal> Event transform(T input)覆蓋,因為這相當於通過不符合接口契約的transform(Animal input)覆蓋方法transform(Object input)

另一方面,如果您希望您的所有Transformer實現都接受Animal ,那么您可以在您的界面中使用<T extends Animal> Event transform(T input) (或我建議的public interface Transformer<T extends Animal> )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM