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>以我建议的形式)。


以上是Java泛型-参数类型和转换的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>