Esto es una continuación de mi pregunta anterior pero dado que el hilo anterior fue largo, decidí comenzar otro hilo relacionado con el mismo tema.Java Generics: pregunta sobre la captura de tipo y la inferencia generada usando métodos genéricos
public class GenericMethodInference {
static <T> void test1(T t1, T t2) {}
static <T> void test3(T t1, List <T> t2) {}
static <T> void test4(List <T> t1, List <T> t2) {}
public static void main(String [] args) {
List <Object> c = new LinkedList<Object>();
List <? extends Object> d = new ArrayList<Integer>();
List e = new ArrayList<Integer>();
test1("Hello", new Integer(1)); // ok clause (1)
GenericMethodInference.<Object>test1("Hello", new Integer(1)); // ok clause (2)
test3("Hello", c); // ok clause (3)
test4(d,d) // clause (4) Error due to different type capture generated
}
Nota: Si mueve el cursor sobre cada cláusula, verá la inferencia que se genera y se muestra en Eclipse:
a. La cláusula (1) producirá <? extiende Object> test1 <? extiende Objeto,? extiende Object>
b. La cláusula (2) producirá exactamente lo que se define en el parámetro de tipo real
c. La cláusula (3) producirá < Objeto> test3 < Objeto, Lista de objetos < >>
Preguntas:
- Por qué la cláusula (1) no produjo < Objeto>? Dado que < Objeto> funciona como se muestra en la cláusula (2), ¿por qué <? extiende Objeto> ser producto en su lugar?
- por qué la cláusula (3) produce < Objeto> en lugar de <? extiende Objeto>?
- Como la cláusula (4) usa la misma variable, ¿por qué se generaron 2 tipos diferentes de captura aunque el parámetro utilizado sea de la misma variable d?
"Si mueve el cursor sobre cada cláusula" - ¿cuál IDE por favor? (actualización: gracias por esa edición) –
Eclipse, dice;) –
¿Qué es la cláusula 4? –