2012-04-04 11 views
39

Recibo una advertencia en eclipse (la versión más reciente) para el siguiente código.Solución de problemas "El parámetro de tipo T oculta el tipo T" de advertencia

public interface A<T> extends B<T> { 
    public T getObject(); 
} 

La advertencia aparece en 'T' en 'A' y dice: "El parámetro de tipo T se esconde el tipo T".

Lo extraño es que el siguiente código no genera errores ni advertencias.

public interface A extends B<T> { 
    public T getObject(); 
} 

Pero ahora no puedo extender A diciendo qué tipo de T es.

Estoy completamente confundido. Alguien sabe por qué está pasando esto? Gracias.

+6

En mi caso, Eclipse había importado automáticamente 'org.apache.poi.ss.formula.functions.T', lo que provocó la advertencia. –

Respuesta

45

¿Usted alguna parte tienen una clase o interfaz llamada T, o ¿Está utilizando T como un nombre de tipo inmediato en algún lugar de como un parámetro de tipo (lo que significa que podría haber olvidado en otro lugar, por ejemplo en una clase envolvente, a especificar que T es un parámetro de tipo)? Puedo reproducir el problema con esto:

class T { // A concrete type T 
} 

interface B<T> { // warning: The type parameter T is hiding the type T 
} 

interface A<T> extends B<T> { // warning: The type parameter T is hiding the type T 
    T getObject(); 
} 

Si quito clase T, desaparece.

+2

¡Eso fue todo, gracias! Resulta que accidentalmente importé una clase con el mismo nombre que el parámetro de tipo. Saqué la importación y funcionó bien. – nikdeapen

+12

Esto también ocurre aparentemente cuando una clase genérica interna reutiliza el mismo parámetro Tipo que la clase adjunta (también genérica). – mgaert

2

Trato:

public interface B<T> { 
    T getObject(); 

    public interface A<T> extends B<T>{ 
     T getObject(); 
    } 
} 

en Eclipse Servicio Indigo Release 2 y no hay ninguna advertencia o error

2

A pesar de que esta pregunta ya está contestada, ya que la línea de asunto se trata ("El parámetro de tipo T está ocultando el tipo T "), solo quiere agregar que esta advertencia no siempre significa que hay una clase o un tipo real" T "declarado en algún lugar de la classpath (o inner class) como sugieren todas las respuestas/comentarios.

considerar lo siguiente:

public class Cache<K extends Comparable<K>,V> { 

    private final ConcurrentHashMap<K,V> _concurrentMap = new ConcurrentHashMap<K,V>(); 

    public <K,V> void add(K key ,V value){ // Compiler warning - The type parameter V is hiding type V (as also for K) 

    _concurrentMap.put(key, value); //Compiler error - K and V passed to add are now being considered different 
            //from whats declared for _concurrentMap variable 
    } 

    public V get(K key){ 
    return _concurrentMap.get(key); 
    } 

    public int size(){ 
    return _concurrentMap.size(); 
    } 
} 

Debido K, V es declarada a nivel de clase, el método añadir también "hereda" la misma. Entonces terminas recibiendo la misma advertencia.

A continuación elimina el error de advertencia y el compilador por supuesto

public <E,F> void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 

Y mi método original es esto.(No requieren tipos genéricos adicionales para mi método)

public void add(K key ,V value){ 
    _concurrentMap.put(key, value); 
} 
2

Sólo para ampliar la respuesta última (Sé pregunta es viejo y cerrado), voy a dar un caso más simple donde se puede entender el error:

Imagínese una interfaz con un método genérico como:

<T> Output<T> doSomething(Input<T> input); 

Si intenta modificarlo así:

@Override 
public <Object> Output<Object> soSomething(Input<Object> input){ 
    /*..*/ 
} 

El compilador le advierte:

The type parameter Object is hiding the type Object

Lo que significa es que "objeto" es una etiqueta genérica aquí, no es java.lang.Object. Si cambió el tipo de Objeto a V o cualquier letra arbitraria, eso no sucedería. Pero está usando y un appelative que colisiona con una clase real definida, por lo que el compilador le advierte que este Object of you está ocultando lo que de otro modo se entendería como la clase Object común.

+1

Dado que el orden en el que se muestran las respuestas no es fijo, la "última respuesta" no indica realmente a qué respuesta se refería. –

+0

Me refiero al de Plaiska – Whimusical

Cuestiones relacionadas