[英]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.