2012-08-28 18 views
9
public class Test<T>{ 

    public boolean isMember(T item) { 

     if(item instanceof Test) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

¿Es esta la forma correcta de comprobar si el elemento es una instancia de la clase?compruebe si el elemento es una instancia de una clase genérica

Realicé algunas búsquedas y parece que para una clase genérica, esto no funcionará.

+6

¿Está tratando de comprobar si el elemento es una instancia de 'Test', una instancia de' T', o una instancia de 'Test '? – StriplingWarrior

+0

@NinjoeQuah Revisa mi respuesta – GingerHead

Respuesta

5

No está claro lo que estás tratando de probar aquí, pero aquí hay algunas posibilidades:

  1. ¿item a T? Sí. De lo contrario, presumiblemente no podría pasarse al método isMember. El compilador no lo permitiría. (Consulte la advertencia de Alex en los comentarios a continuación.)
  2. ¿item a Test? Su método isMember tal como está escrito lo probaría, pero estoy sintiendo un olor a código aquí. ¿Por qué esperaría que un T fuera también un Test, pero solo parte del tiempo? Es posible que desee reconsiderar cómo está organizando sus clases. Además, si esto es realmente lo que quieres, entonces su método podría ser escrito como:

    public boolean isMember(T item) { 
        return (item instanceof Test); 
    } 
    

    lo cual plantea la pregunta: ¿Por qué tener un método como este en el primer lugar? ¿Cuál es más fácil de escribir?

    if(obj instanceof Test) {...} 
    

    o

    if(Test<Something>.isMember(obj)) {...} 
    

    Yo diría que el primero es más simple, y la mayoría de los desarrolladores de Java a entender lo que significa más fácilmente que un método personalizado.

  3. ¿Es item a Test<T>? No hay forma de saber esto en tiempo de ejecución porque Java implementa genéricos utilizando borrado. Si esto es lo que quieres, tendrás que modificar la firma del método para que sea como el ejemplo de Mike Myers.

+2

"El compilador no lo permitiría". - Suponiendo que está utilizando la firma genérica correcta en todas las referencias a la clase, esto es cierto. Aún puede usar referencias al 'raw' de tipo sin formato para pasar un elemento que no es una instancia de' T' a 'isMember', pero el compilador le lanzará todo tipo de advertencias si lo hace. – Alex

0

T no es una variable, sino un marcador de posición para una clase que se define en tiempo de ejecución. Los genéricos son una característica de tiempo de compilación, por esa razón agregan cheques en tiempo de compilación que pueden no tener ningún significado en el tiempo de ejecución. Solo podemos verificar el tipo de objeto al que se hace referencia en tiempo de ejecución, que podría ser un tipo de superclase en el código. Si queremos pasar el tipo T como parámetro al método, todo lo que tenemos que hacer es abordar de forma explícita como la siguiente:

void genericMethod(Class<T> tClass) { 
    if(String.class.isAssignableFrom(tClass)) 

o

void genericMethod(Class<T> tClass, T tArg) { 

Tenga en cuenta que el tipo podría no ser el mismo que aquí podemos ver cómo manipular:

genericMethod(Number.class, 1); 
0

LinkList public class {

public boolean isMemberOfClass(T item) { 

    if(item instanceof LinkList) 
    { 
     return true; 
    } 
    return false; 
} 

}

Lo siento, no soy suppost para publicar la pregunta como la respuesta.

la clase LinkList es una clase genérica. la función es verificar si el elemento pertenece a la clase. compruebe si tiene el mismo T.

Cuestiones relacionadas