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