2010-06-10 20 views
7

Böyle olarak şu sınıfını tanımlamak istiyorum:Bu Java'da Generics ile bir sınırlama mı?

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

Bu (cannot resolve symbol T) derlenmeyecektir. Aşağıdaki sınıf beyanı değiştirin:

public class CollectionAttribute<E extends Collection<?>> 

Sonra koleksiyonun parametrized türünü başvuramaz.

Java'da bir şey eksik mi ya da jeneriklerle bir sınırlamaya ulaştım mı?

cevap

13

Sen T için ikinci bir jenerik parametre eklemek gerekir: Nathan belirttiği gibi

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

, ayrıca value.add(T) yazamazsınız.

+0

: -o Herhangi bir kısa açıklama neden? – OscarRyz

+0

@Support: Aksi takdirde, "T" tipi yoktur. – SLaks

+0

Bu gereksiz değil mi? Şimdi bu nesneyi oluşturduğumda iki kez T'yi belirtmem gerekiyor :( –

7

Örnek sınıfınızda iki sorun var. Birincisi, T'nin ne anlama geldiğini bildirmeniz gerektiğidir, bunun anlamı, sınıfın Genetiklerinde yer alması veya gerçek bir sınıf türü olması demektir. Bu durumda, muhtemelen

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

ilk geçmiş derleyici kazanılmış olsaydın muhtemelen bulurdum ikinci sorun, sizin addValue yöntemin vücut koleksiyonuna tipi T eklemeye çalışırken olmasıdır istiyorum Bu değerden daha çok:

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