2012-02-21 13 views
8

Si tengo el siguiente:método genérico - "conversión sin control para ajustarse a T a partir del tipo" de advertencia

public interface Foo { 
    <T extends Foo> T getBlah(); 
} 

public class Bar implements Foo { 
    public Bar getBlah() { 
     return this; 
    } 
} 

recibo una advertencia en Eclipse sobre la implementación de la 'getBlah' en la clase de barras:

- Type safety: The return type Bar for getBlah from the type Bar needs unchecked conversion to conform to T from the type 
Foo 

¿Cómo puedo solucionar esto? ¿Y por qué recibo la advertencia?

Gracias

+0

Usted escribió que el tipo devuelto por 'getBlah' debe extender la interfaz' Foo'. Pero 'Bar' no lo hace, lo implementa. – vulkanino

+2

'extends' cubre implementaciones de interfaz – Joeblackdev

+0

Un caso de sobre-genérico. Ver el comentario de Joeblackdev y la respuesta de Alessandro Santini. – Saintali

Respuesta

13

está sustituyendo un método de su interfaz, por lo que su aplicación debe coincidir con la firma de su especificación:

public class Bar { 
    @Override 
    public <T extends Foo> T getBlah() { 
     return this; 
    } 
} 

Ahora, si estuviera en su lugar pensando en la creación de una anulación establecieron los parámetros específicamente de toda la implementación, entonces necesita especificar el tipo genérico como parte de la definición de la interfaz:

public interface Foo<T extends Foo<T>> { 
    T getBlah(); 
} 

public class Bar implements Foo<Bar> { 
    @Override 
    public Bar getBlah() { 
     return this; 
    } 
} 
+0

¿Y por qué, en nombre de Dios, debería inferir un tipo genérico que no se usa en ninguna parte? –

+0

No asumo que este es su código completo. Porque sabes lo que dicen sobre las suposiciones ... – Perception

+0

La primera línea debe ser 'interfaz pública Foo >' o 'interfaz pública Foo >'. –

3

No soy Seguro ¿Qué desea lograr aquí, pero creo que la devolución de Foo estaría bien:

interface Foo { 

    public Foo getBlah(); 

} 

ya que no se está utilizando el tipo genérico en cualquier lugar de los parámetros.

4
<T extends Foo> T getBlah(); 

significa que una persona que llama puede solicitar cualquier tipo como para ser devueltos T. Así que no importa qué clase sea el objeto, puedo solicitar alguna otra subclase aleatoria de Foo de mi elección para ser devuelta. El único valor que ese método podría devolver válidamente es null (a menos que tenga moldes inseguros), que probablemente no sea lo que usted desea.

Cuestiones relacionadas