2015-05-02 50 views
4

我有一個接口:如何使<T extends E>泛型類型參數包含在內?

/** 
    * 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); 
    } 

在一種情況下,我想使用的接口GameObject本身,而不是某些子類。我想這樣做在遊戲中的對象的List

/** 
    * Will call the given value getter for all elements of this collection and return array of values. 
    * @param <T> 
    * @param <V> 
    * @param reader 
    * @return 
    */ 
    public <T extends GameObject, V> List<V> enumValues(ValueGetter<T, V> reader) { 
    List<V> vals = new ArrayList(); 

    for(GameObject o : this) { 
     vals.add(reader.getValue(o)); 
    } 
    return vals; 
    } 

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>) 

我的形象問題:

image description

回答

2
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; 
} 
0

T可以是一個遊戲對象,或它的一個孩子。比方說,孩子的名字是NPCObject。 所以你用T作爲NPCObject調用enumValues。

ValueGetter可能會針對NPCObjects進行優化,因此您無法使用GameObject實際調用它! ValueGetter將如何處理這個問題?

ValueGetter處理T(在這種情況下爲NPCObject)。類型< T擴展了GameObject>提到了一種類型:T。它不會說:所有類型是GameObject或它的後代。 T是固定的,方法本身不知道它是什麼。

0

我不認爲有一種方法可以在Java中使用這種方法。一個建議是在GameObject的頂部有封裝類型。

相關問題