Operador instanceof com genéricos

Alguém sabe porque que não funciona?

Aparece:

Found: T
Required: Class or Array

Eu já procurei aqui no forum so que quando eu entro no tópico o internet explorer fecha :frowning:
Obrigado vlw

Como você está usando?

  public <T extends Building> ArrayList<T> getBuildings()
  {
    ArrayList<T> foundList = new ArrayList<T>();
    Iterator i = buildings.iterator();
    while ( i.hasNext() )
    {
      Building n = ( Building )i.next();
      if ( n instanceof T )
        foundList.add( ( T ) n );
    }
  }

Infelizmente, isso é uma limitação de como o java é implementado.

O tipo T, depois da compilação, simplesmente desaparece. O java encara tudo como object e faz casts automaticamente. Fizeram assim para manter a compatibilidade do código, mas isso impede várias coisas como reflexão, criação de objetos ou tentativas de usar instanceof com T.

Agora, porque no seu método você não retorna um List<Building> mesmo?

Me parece mais lógico fazer assim:

public List<Building> getBuildings(Class<? extends Building> buildingClass) { List<Building> foundList = new ArrayList<T>(); for (Building n : buildings) { if (buildClass.isAssignableFrom(n)) { foundList.add(n ); } } }

Geramente, usamos esses “T extends” para especificar tipos de listas em parâmetros.
Um parâmetro do tipo List<T extends Mamifero> aceitaria uma List<Homem> ou um List<Cachorro>. Um parâmetro com List<T super Homem> aceitaria um List<Mamifero> ou List<Cordado>. Faz pouco sentido retornar um List<T extends qualquer coisa> como parâmetro. Nesse caso, retorne um List do tipo certo, já que esse list admitirá o tipo, ou filhos desse tipo no seu interior.

[quote=Polimorphism] public <T extends Building> ArrayList<T> getBuildings() { ArrayList<T> foundList = new ArrayList<T>(); Iterator i = buildings.iterator(); while ( i.hasNext() ) { Building n = ( Building )i.next(); if ( n instanceof T ) foundList.add( ( T ) n ); } } [/quote]

O Vini já respondeu mas só queria resaltar que:

  1. Não use o iterador dessa maneira, use sempre dentro de um for. A regra é “Variáveis devem ter o minimo escopo possivel”
  2. n intanceOf T não funciona porque T não é uma classe , é um tipo genérico. Ou seja, o compilador não saberá qual classe usar para a comparação.

Ok, vlw a todos consegui fazer aqui :slight_smile:

Não Esqueça de editar o Título adicionando a tag [RESOLVIDO] no final do Título , Depois tirar suas duvidas.