Generics: "unchecked cast" com listas

5 respostas
C

Olá pessoal,

Às vezes coloco listas de objetos na sessão do usuário e posteriormente recupero essas listas para realizar certas operações. Até ai, tudo bem. O que está me deixando incomodado é que não consigo fazer o cast ou usar os recursos da API de Generics para que o Eclipse pare de dar warnings do tipo "Type safety: Unchecked cast from Object to List<Blabla>.

Se eu tenho uma lista na sessão do tipo

List&lt;Blabla&gt; lista = ...

E quero recuperá-la, eu faço

List&lt;Blabla&gt; = (List&lt;Blabla&gt;) minhaSessao.getAttribute("nomedoatributo");

Mas não sei qual a maneira certa para não receber esses warnings. Tudo funciona belezinha, mas tá na cara que da maneira como venho fazendo está errado…

Abraço!

5 Respostas

T

Para parar o warning, você usa @SuppressWarnings, mas põe um comentário, é óbvio.

import java.util.*;

class BlaBlaBla {
}

class Session {
    // Note que como ele retorna um Object não há como o compilador saber
    // que ele vai retornar um ArrayList&lt;BlaBlaBla&gt; - imagine se você
    // usar uma subclasse:
    public Object getAttribute() { return new ArrayList&lt;BlaBlaBla&gt;(); }
}

class MySession extends Session {
    public Object getAttribute() { return super.getAttribute(); }
}

class TesteSessionGetAttribute {
    public static void main (String[] args) {
        Session session = new MySession();
        // "Gambiarra detector activated"....
        @SuppressWarnings ("unchecked")
        List &lt;BlaBlaBla&gt; blaList = (List&lt;BlaBlaBla&gt;) session.getAttribute();
    }
}
C
thingol:
Para parar o warning, você usa @SuppressWarnings, mas põe um comentário, é óbvio.
import java.util.*;

class BlaBlaBla {
}

class Session {
    // Note que como ele retorna um Object não há como o compilador saber
    // que ele vai retornar um ArrayList&lt;BlaBlaBla&gt; - imagine se você
    // usar uma subclasse:
    public Object getAttribute() { return new ArrayList&lt;BlaBlaBla&gt;(); }
}

class MySession extends Session {
    public Object getAttribute() { return super.getAttribute(); }
}

class TesteSessionGetAttribute {
    public static void main (String[] args) {
        Session session = new MySession();
        // "Gambiarra detector activated"....
        @SuppressWarnings ("unchecked")
        List &lt;BlaBlaBla&gt; blaList = (List&lt;BlaBlaBla&gt;) session.getAttribute();
    }
}

Eu já uso o SuppressWarnings("unchecked"), mas achei que talvez houvesse uma maneira certa de fazer o cast. Realmente, pensando bem não tem como mesmo, pois estou retornando um tipo a partir de sua interface e não da implementação, certo?

Valeu Thingol!

T

Se em vez de usar a classe Session você usasse outra coisa, provavelmente não teria esse problema. Vou dar um exemplo:

import java.util.*;

class BlaBlaBla {
}

class BleBleBle extends BlaBlaBla {
}

class ListGenerator {
    public &lt;T&gt; List&lt;T&gt; getNewList (Class&lt;T&gt; klass) {
        return new ArrayList&lt;T&gt;();
    }
}

class EnhancedListGenerator extends ListGenerator {
    public &lt;T&gt; List&lt;T&gt; getNewList (Class&lt;T&gt; klass) {
        return Collections.checkedList (new ArrayList&lt;T&gt;(), klass);
    }
}

class TesteSessionGetAttribute {
    public static void main (String[] args) {
        ListGenerator listGenerator = new ListGenerator();
        ListGenerator enhancedListGenerator = new EnhancedListGenerator();
        List&lt;BlaBlaBla&gt; blaList = enhancedListGenerator.getNewList (BlaBlaBla.class);
        blaList.add (new BleBleBle());
    }
}
C
thingol:
Se em vez de usar a classe Session você usasse outra coisa, provavelmente não teria esse problema. Vou dar um exemplo:
import java.util.*;

class BlaBlaBla {
}

class BleBleBle extends BlaBlaBla {
}

class ListGenerator {
    public &lt;T&gt; List&lt;T&gt; getNewList (Class&lt;T&gt; klass) {
        return new ArrayList&lt;T&gt;();
    }
}

class EnhancedListGenerator extends ListGenerator {
    public &lt;T&gt; List&lt;T&gt; getNewList (Class&lt;T&gt; klass) {
        return Collections.checkedList (new ArrayList&lt;T&gt;(), klass);
    }
}

class TesteSessionGetAttribute {
    public static void main (String[] args) {
        ListGenerator listGenerator = new ListGenerator();
        ListGenerator enhancedListGenerator = new EnhancedListGenerator();
        List&lt;BlaBlaBla&gt; blaList = enhancedListGenerator.getNewList (BlaBlaBla.class);
        blaList.add (new BleBleBle());
    }
}

Entendi, obrigado!

R

Solucao

public construtor(){

List var;

var=new ArrayList()

}

como em
http://www.onjava.com/pub/a/onjava/2005/07/06/generics.html (22/04/2009)

Criado 18 de dezembro de 2007
Ultima resposta 22 de abr. de 2009
Respostas 5
Participantes 3