Para una interfaz genérica:¿Qué significa realmente el comodín del parámetro de tipo de Java? ¿Cuál es la verdadera diferencia entre Foo y Foo <?>?
public interface Foo<T> {
void f(T t);
}
La diferencia entre los dos campos:
public class Bar {
Foo foo1;
Foo<?> foo2;
}
Es eso foo2
es un tipo genérico y foo
no lo es. Como ?
es un comodín (que creo que se refiere a cualquier tipo) y cada tipo es un subtipo de Objeto, entonces espero que Foo<?>
y Foo<Object>
sean equivalentes semánticamente y sintácticamente.
Sin embargo, echa un vistazo a los siguientes:
public class Puzzler {
void f() {
Integer i = null;
Foo<?> foo1 = null;
foo1.foo(i); // ERROR
Foo foo2 = null;
foo2.foo(i); // OKAY
Foo<Integer> foo3 = null;
foo3.foo(i); // OKAY
Foo<Object> foo4 = null;
foo4.foo(i); // OKAY
}
private interface Foo<T> {
void foo(T t);
}
}
Así Foo<?>
Foo<Object>
y son no la misma sintácticamente.
¿Qué está pasando aquí? Estoy bastante atrapado tratando de entender esto.
asumiendo que estos son errores de compilación? – paislee
@andrewcooke Ese código sería válido; sin embargo, dado que el objeto se almacenaría en una variable 'Foo >', no conocería el parámetro 'String'. En consecuencia, si 'Foo' tiene algún método que tome argumentos de tipo' T', el único valor permitido sería 'null', y si tiene algún método que devuelva' T', se trata como 'Object'. – Taymon
lo siento, borré mi comentario antes de ver su respuesta. ahora estoy confundido cuando funciona la captura? –