verificar se item é instância de uma classe genérica

9
public class Test<T>{

    public boolean isMember(T item) {

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

Esta é a maneira correta de verificar se o item é uma instância da classe?

Eu passei por algumas pesquisas e parece que, para uma classe genérica, isso não funcionará.

    
por Ninjoe Quah 28.08.2012 в 17:17
fonte

3 respostas

5

Não está claro o que você está tentando testar aqui, mas aqui estão algumas possibilidades:

  1. É item a T ? Sim. Caso contrário, presumivelmente não poderia ser passado para o método isMember . O compilador não permitiria isso. (Veja a advertência de Alex nos comentários abaixo.)
  2. É item a Test ? Seu método isMember , como está escrito, testaria isso, mas estou sentindo um cheiro de código aqui. Por que você esperaria que um T também fosse um Test , mas apenas uma parte do tempo? Você pode querer reconsiderar como está organizando suas aulas. Além disso, se isso é realmente o que você quer, então seu método pode ser escrito como:

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

    O que levanta a questão: por que ter um método como esse em primeiro lugar? Qual é mais fácil de escrever?

    if(obj instanceof Test) {...}
    

    ou

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

    Eu diria que o primeiro é mais simples, e a maioria dos desenvolvedores Java entenderão o que significa mais prontamente do que um método personalizado.

  3. É item a Test<T> ? Não há como saber isso em tempo de execução porque o Java implementa genéricos usando o apagamento. Se isto é o que você quer, você terá que modificar a assinatura do método para ser como o exemplo de Mike Myers.

por StriplingWarrior 28.08.2012 / 17:32
fonte
0

T não é uma variável, mas um marcador de espaço para uma classe definida em tempo de execução. Os genéricos são um recurso de tempo de compilação, por esse motivo eles adicionam verificações em tempo de compilação, o que pode não ter nenhum significado em tempo de execução. Só podemos verificar o tipo do objeto referenciado no tempo de execução, que pode ser um tipo de superclasse no código. Se quisermos passar o tipo T como parâmetro para o método, tudo o que temos a fazer é abordar explicitamente o seguinte:

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

ou

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

Note que o tipo pode não ser o mesmo que aqui podemos ver como manipular:

genericMethod(Number.class, 1);
    
por GingerHead 28.08.2012 / 17:28
fonte
0

public class LinkList {

public boolean isMemberOfClass(T item) {

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

}

Desculpe, não posso postar a pergunta como resposta.

a classe LinkList é uma classe genérica. a função é verificar se o item pertence à classe. verifique se tem o mesmo T.

    
por Ninjoe Quah 29.08.2012 / 17:33
fonte