Este es un ejemplo que inventé como una simplificación de mi código real, por lo que me disculpo si es un poco artificial. Lo que me gustaría hacer es obtener efectivamente dos parámetros de tipo de un único argumento de tipo anidado. Estoy bastante seguro de que esto es imposible, pero pensé que lo probaría.Parámetros de tipo anidado en Java
//Not legal java code
public class Foo<C extends Collection<T>> { //where T is another type parameter
private C coll;
public Foo(C coll) {
this.coll = coll;
}
public void add(T elem){
this.coll.add(elem);
}
//UPDATED TO ADD GETTER
/**
* I may need to retrieve the collection again, or pass it
* on to another function that needs the specific C type
*/
public C getColl(){
return coll;
}
}
...
List<String> strings = new ArrayList<String>();
Foo<List<String>> foo = new Foo<List<String>>(strings);
foo.add("hello");
sé que podría hacerlo mediante la adición de otro tipo de parámetro:
public class Foo<C extends Collection<T>,T>
pero luego tengo que añadir el redundante:
Foo<List<String>,String> foo = new Foo<List<String>,String>(strings);
Y en mi caso en el mundo real, mis genéricos a veces se pueden especificar en la cláusula Implements como
public class Bar implements Baz<String>
Tener que especificar ese segundo parámetro de tipo es aún más doloroso, porque parece que arroja los detalles de implementación en mi cara. Tener que decir
Foo<Bar,String>
cuando ya existe una relación entre String y Bar, parece poco elegante. Entiendo que es Java, así que eso va con el territorio, pero es curioso si hubo una solución para esto.
La idea del método de fábrica es interesante, pero aún me molesta que el tipo se especifique dos veces, aunque mi código dicta que siempre serán las mismas. –
@RusselLeggett, vale, entonces necesitas invarianza entonces, no 'Colección super T>'? Sí. Eso es un dolor. Mi consejo sería tratar con la complejidad de su biblioteca y tratar de exponer las API con fábricas cuyo tipo de devolución es 'interfaz Foo extiende ComplicatedFoo , T>' para que los clientes puedan usar la versión de un solo parámetro. –