Java泛型-参数类型和转换
我有一个我正在尝试解决的泛型问题。我正在做一些手动铸造,感觉就像我做错了什么。我对使用泛型有点陌生,所以我很可能在某些方面滥用了它们。非常感谢一些指导。
TLDR:
我有一个带有参数的通用方法的接口T。我在一个类中实现了这个接口,但是在实现者中我想确保T它是一个特定的类型(可以说Animal我可以提取一些字段)。我怎样才能做到这一点?
详细信息:
我在Transformer下面有一个接口,以及一个实现类 where 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
}
回答
与其将泛型约束放在方法上,不如将约束放在接口(和类)上:
public interface Transformer<T> {
Event transform(T input);
}
并且在类上,您要么将新的泛型类型约束到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(Object input)通过transform(Animal input)不符合接口契约。
另一方面,如果您希望所有Transformer实现都接受Animal,那么您可以<T extends Animal> Event transform(T input)在您的界面中使用(或public interface Transformer<T extends Animal>以我建议的形式)。