2010-06-10 54 views
7

我想定義下面的類這樣:這是Java中泛型的限制嗎?

public class CollectionAttribute<E extends Collection<T>> { 
    private String name; 
    private E value; 
    public CollectionAttribute(String name, E value) { 
     this.name = name; 
     this.value = value; 
    } 

    public E getValue() { return value; } 

    public void addValue(T value) { value.add(T); } 
} 

這不會編譯(cannot resolve symbol T)。如果我用以下代碼替換類聲明:

public class CollectionAttribute<E extends Collection<?>> 

然後我無法引用集合的參數化類型。

我是否錯過了某些東西,或者我在Java中使用泛型時遇到了限制?

回答

13

您需要添加第二個泛型參數爲T:

public class CollectionAttribute<T, E extends Collection<T>> { 
    private String name; 
    private E values; 
    public CollectionAttribute(String name, E values) { 
     this.name = name; 
     this.values = values; 
    } 

    public E getValue() { return value; } 

    public void addValue(T value) { values.add(value); } 
} 

彌敦道指出的那樣,你也可以不寫value.add(T)

+0

:-o任何簡短解釋爲什麼? – OscarRyz 2010-06-10 17:12:17

+0

@支持:否則,沒有'T'類型。 – SLaks 2010-06-10 17:12:50

+0

這不是多餘的嗎?現在,當我創建這個對象時,我必須指定我的T兩次:( – 2010-06-10 17:16:21

7

您的示例類有兩個問題。首先是你需要聲明T的含義,這意味着它需要包含在類的泛型中,或者是真正的類類型。在這種情況下,你可能想

public class CollectionAttribute<T, E extends Collection<T>> 

第二個問題,你很可能會發現,如果你得到了編譯器經過第一是你的addValue法的身體正在努力的類型T添加到集合,而不是該值:

public void addValue(T value) { this.value.add(value); }