Java 如何制作<;T扩展E>;泛型类型参数是否包含?

Java 如何制作<;T扩展E>;泛型类型参数是否包含?,java,generics,inheritance,Java,Generics,Inheritance,我有一个界面: /** * Getter for any values within the GameObject and it's subclasses. * Used as callback. * * Typical implementation would look like: * new ValueGetter<SummonerSpell, String> { * public String getValue(Summo

我有一个界面:

  /**
   * Getter for any values within the GameObject and it's subclasses. 
   * Used as callback.
   * 
   * Typical implementation would look like:
   *   new ValueGetter<SummonerSpell, String> {
   *     public String getValue(SummonerSpell source) {
   *       return source.toString();
   *     }
   *   }
   * @param <T> 
   * @param <V> Type of value retrieved
   */
  public static interface ValueGetter<T extends GameObject, V> {
    public V getValue(T source);
  }
但是
reader.getValue(o)
会导致编译器错误:

incompatible types: GameObject cannot be converted to T
  where T,V are type-variables:
    T extends GameObject declared in method <T,V>enumValues(ValueGetter<T,V>)
    V extends Object declared in method <T,V>enumValues(ValueGetter<T,V>)
不兼容类型:游戏对象无法转换为T
其中T,V是类型变量:
T扩展方法enumValues(ValueGetter)中声明的游戏对象
V扩展方法enumValues(ValueGetter)中声明的对象
我的问题是图像:


T可能是游戏对象,也可能是游戏对象的子对象。假设子名称为NPCObject。 因此,您使用T作为NPCObject调用enumValues

ValueGetter可能针对NPCObjects进行了优化,所以你不能用游戏对象来调用它!ValueGetter会怎么做

ValueGetter处理的是T(本例中为NPC项目)。类型提到了一种类型:T。它并没有说:是GameObject或其后代的所有类型。T是固定的,并且方法本身不知道它是什么。

公共列表enumValues(列表列表,ValueGetter阅读器){
public <T extends GameObject, V> List<V> enumValues(List<T> list, ValueGetter<T, V> reader) {
    List<V> vals = new ArrayList();

    for(T o : list) {
        vals.add(reader.getValue(o));
    }
    return vals;
}
List vals=new ArrayList(); 对于(TO:列表){ vals.add(reader.getValue(o)); } 返回VAL; }
我认为在Java中没有办法解决这个问题。一个建议是将包装器类型放在GameObject的顶部

public <T extends GameObject, V> List<V> enumValues(List<T> list, ValueGetter<T, V> reader) {
    List<V> vals = new ArrayList();

    for(T o : list) {
        vals.add(reader.getValue(o));
    }
    return vals;
}