Generics: "unchecked cast" com listas

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!

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();
    }
}
1 curtida

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

[code]
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<BlaBlaBla> - imagine se você
// usar uma subclasse:
public Object getAttribute() { return new ArrayList<BlaBlaBla>(); }
}

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 <BlaBlaBla> blaList = (List<BlaBlaBla>) session.getAttribute();
}
}
[/code][/quote]

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!

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());
    }
}

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

[code]
import java.util.*;

class BlaBlaBla {
}

class BleBleBle extends BlaBlaBla {
}

class ListGenerator {
public <T> List<T> getNewList (Class<T> klass) {
return new ArrayList<T>();
}
}

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

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

[/code][/quote]

Entendi, obrigado!

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)