À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>.
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…
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<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();
}
}
[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?
[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());
}
}