Mi problema se puede resumir en marcha por este fragmento:Genéricos y convertir al tipo de derecho
public interface TheClass<T> {
public void theMethod(T obj);
}
public class A {
private TheClass<?> instance;
public A(TheClass<?> instance) {
this.instance = instance;
}
public void doWork(Object target) {
instance.theMethod(target); // Won't compile!
// However, I know that the target can be passed to the
// method safely because its type matches.
}
}
Mi clase A
utiliza una instancia de TheClass
con su tipo genéricos desconocido. Presenta un método con un objetivo pasado como Object
ya que la instancia TheClass
se puede parametrizar con cualquier clase. Sin embargo, el compilador no me permitirá pasar el objetivo así, lo cual es normal.
¿Qué debo hacer para evitar este problema?
Una solución sucia es declarar la instancia como TheClass<? super Object>
, que funciona bien, pero es semánticamente mal ...
Otra solución he usado antes de que se declare la instancia como tipo de prima, simplemente TheClass
, pero es malo practicar, entonces quiero corregir mi error.
Solución
public class A {
private TheClass<Object> instance; // type enforced here
public A(TheClass<?> instance) {
this.instance = (TheClass<Object>) instance; // cast works fine
}
public void doWork(Object target) {
instance.theMethod(target);
}
}
¿Por qué no se escribe también 'A'? –
+1, para una buena pregunta !! esperando las respuestas ... – aProgrammer
A es parte de una biblioteca de código abierto que hice, que es utilizada por mucha gente, y escribir A significaría una gran pausa para la API. Recientemente descubrí este problema porque antes usaba tipos sin formato para la instancia "TheClass", ya que no sabía que era una mala concepción. Funcionó bien, pero se considera una mala práctica, así que quiero corregir este mal uso. –