2012-04-16 6 views
7

En mi interfaz:genéricos de Java - La cadena de parámetros de especificaciones está ocultando el tipo String

public <T> Result query(T query) 

En mi primera subclase:

public <HashMap> Result query(HashMap queryMap) 

En mi segunda subclase:

public <String> Result query(String queryStr) 

La primera subclase no tiene advertencia de compilación, mientras que la segunda subclase tiene: El parámetro de tipo String está ocultando el tipo ¿Cuerda? Entiendo que mi parámetro está oculto por el tipo de genéricos. Pero quiero entender lo que pasó exactamente?

Respuesta

15

Cree que está intentando crear un parámetro de tipo - una variable - cuyo nombre es String. Sospecho que su primera subclase simplemente no importa java.util.HashMap.

En cualquier caso, si T es un parámetro de tipo de su interfaz - lo que probablemente debería - entonces usted no debe ser incluido en la <String> las subclases en absoluto. Simplemente debería ser

public interface Interface<T> { 
    public Result query(T query); 
} 

public class Subclass implements Interface<String> { 
    ... 
    public Result query(String queryStr) { 
    ... 
    } 
} 
+0

Como problema de estilo, no recomendaría nombrar un parámetro de tipo 'String' u otros nombres de clase de Java utilizados comúnmente. Es potencialmente confuso para cualquiera que examine el código más adelante. Si veo 'String' en Java, supongo que es' java.lang.String'. – oconnor0

+1

Oh, absolutamente. Sospecho que el ejemplo que doy aquí es lo que el OP_meant_ a hacer, sin embargo. –

+0

También le recomendamos echar un vistazo a [esta pregunta de S & O] (http://stackoverflow.com/questions/10011758/troubleshooting-the-type-parameter-t-is-hiding-the-type-t-warning) . –

Cuestiones relacionadas