繁体   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