que tengo una clase de legado que la clase en sí no es un genérico, pero uno de sus métodos devuelven tipo utiliza genéricos:referencia no genérica a resultados de la clase genérica de tipos de retorno no genéricos
public class Thing {
public Collection<String> getStuff() { ... }
}
getStuff()
usos genéricos para devolver una colección de cadenas. Por lo tanto puedo iterar sobre getStuff()
y no hay necesidad de emitir los elementos a un String
:
Thing t = new Thing();
for (String s: t.getStuff()) // valid
{ ... }
Sin embargo, si cambio Thing
a sí misma como un genérico, pero mantener todo lo demás igual:
public class Thing<T> {
public Collection<String> getStuff() { ... }
}
y luego siga utilizando la referencia no genérica a Thing
, getStuff()
ya no devuelve Collection<String>
y en su lugar devuelve un Collection
sin tipo. Por lo tanto, el código del cliente no compila:
Thing t = new Thing();
for (String s: t.getStuff()) // compiler complains that Object can't be cast to String
{ ... }
¿Por qué es esto? ¿Cuáles son las soluciones?
Supongo que al utilizar una referencia no genérica a una clase genérica, Java desactiva todos los genéricos para toda la clase. Esto es doloroso, porque ahora he roto mi código de cliente al hacer que Thing sea genérico.
Edición: Estoy haciendo Thing genérico para otro método que no se encuentra en el código de ejemplo anterior. Mi pregunta es educativa sobre por qué lo anterior no se puede hacer.
estoy haciendo cosa genérica, porque de otro método (que no figura en mi ejemplo). –
Si cosa es cosa (y no la cosa >), no compilará. Sigue adelante e inténtalo. –
malentendió la pregunta, cambió. – cletus