2010-06-10 16 views
7

quiero definir la siguiente clase como tal:¿Es esto una limitación con Generics en 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); } 
} 

Esto no se compilará (cannot resolve symbol T). Si reemplazo la declaración de clase con lo siguiente:

public class CollectionAttribute<E extends Collection<?>> 

Entonces no puedo hacer referencia al tipo parametrizado de la colección.

¿Me falta algo o he llegado a una limitación con los genéricos en Java?

Respuesta

13

es necesario agregar un segundo parámetro genérico para 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); } 
} 

Como Nathan señaló, también puede escribir no value.add(T).

+0

: -o Cualquier breve explicación de por qué? – OscarRyz

+0

@Support: De lo contrario, no hay tipo 'T'. – SLaks

+0

¿No es esto redundante? Ahora tengo que especificar mi T dos veces cuando creo este objeto :( –

7

Hay dos problemas con su clase de ejemplo. El primero es que debe declarar lo que T significa, lo que significa que debe estar incluido en los genéricos para la clase o ser un tipo de clase real. En este caso, es probable que desee

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

El segundo problema, que probablemente habría encontrado si hubiera llegado el compilador más allá de la primera es que el cuerpo de su método Addvalue está tratando de agregar el tipo T para la colección , en lugar de ese valor:

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