2011-09-27 15 views
10

¿por qué¿cuál es la diferencia? y T en las firmas de clases y métodos?

public interface ArrayOfONEITEMInterface <T extends ONEITEMInterface>{ 
    public List<T> getONEITEM(); 
} 

de compilación, pero no

public interface ArrayOfONEITEMInterface <? extends ONEITEMInterface>{ 
    public List<?> getONEITEM(); 
} 

¿cuál es la diferencia entre? y T en las firmas de clases y métodos?

Respuesta

17

? es un comodín y significa cualquier subclase de ONEITEMInterface incluyéndose.

T es un implementación específica de ONEITEMInterface en este caso.

Dado que ? es un comodín, no hay relación entre su ? en la declaración de clase y ? en su declaración de método por lo que no se compilará. Solo List<?> getONEITEM(); compilará sin embargo.


El primer escenario significa la clase entera puede manejar exactamente uno tipo de Bar por ejemplo.

interface Foo<T extends Bar> { 
    List<T> get(); 
} 

El segundo escenario permite cada instancia para operar en cualquier subtipo de Bar

interface Foo { 
    List<? extends Bar> get() 
} 
1

T es un marcador de posición para un tipo que será proporcionado por una clase de ejecución o instanciar .

? es un marcador de posición que dice "No sé o no me importa cuál es el tipo genérico" que generalmente se usa cuando el trabajo que hará en el objeto contenedor no necesita saber el tipo.

La razón por la que no puede usar '?' en la definición de clase/interfaz es porque está el valor que está diciendo definir el nombre del marcador de posición (y el tipo se proporcionará en otro lugar). Poniendo un '?' no tiene sentido

Además, el marcador de posición no necesita ser T, puede ser cualquier variable Java estándar. Por convención, es un personaje capital, pero no es necesario que lo sea.

0

? le permite tener una lista de tipos desconocidos, mientras que T requiere un tipo definido.

2

La cláusula <T extends ONEITEMInterface> declara un parámetro de tipo denominado T. Esto permite que su tipo genérico, ArrayOfONEITEMInterface, haga referencia al parámetro en otro lugar. Por ejemplo, puede declarar un método como void add(T t).

Sin nombrar el parámetro de tipo, ¿cómo se referiría a él? Si nunca hace referencia al parámetro tipo, ¿por qué su tipo es genérico en primer lugar?Por ejemplo, no es necesario un tipo parametrizado para hacer algo como esto:

public interface ArrayOfONEITEMInterface { 
    List<? extends ONEITEMInterface> getONEITEM(); 
} 

No tiene sentido declarar un parámetro de tipo anónimo, por lo que es sintácticamente incorrecto.

Cuestiones relacionadas