2010-06-10 13 views
7

Chcę określić następujące klasy jako takie:Czy to jest ograniczenie z generics w Javie?

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

To nie będzie kompilować (cannot resolve symbol T). Jeśli zamieniam deklarację klasy na:

public class CollectionAttribute<E extends Collection<?>> 

Wtedy nie mogę odwołać się do sparametryzowanego typu kolekcji.

Czy brakuje mi czegoś, czy też osiągnąłem ograniczenie z lekami generycznymi w Javie?

Odpowiedz

13

Trzeba dodać drugi parametr dla rodzajowego 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); } 
} 

jako Nathan wskazał, również nie można napisać value.add(T).

+0

: -o Jakieś krótkie wyjaśnienie dlaczego? – OscarRyz

+0

@ Support: w przeciwnym razie nie ma typu "T". – SLaks

+0

Czy to nie jest zbyteczne? Teraz muszę określić mój T dwa razy, gdy tworzę ten obiekt :( –

7

Występują dwa problemy z twoją klasą przykładową. Po pierwsze, musisz zadeklarować, co oznacza T, co oznacza, że ​​musi być uwzględnione w Generics dla klasy lub być prawdziwym typem klasy. W tym przypadku, prawdopodobnie chcesz

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

Drugim problemem, który prawdopodobnie znalazłby gdybyś dostał kompilator po pierwszym jest to, że ciało metodę addValue za stara, aby dodać typ T do odbioru , a nie ta wartość:

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