[quote=maquiavelbona]O que vem após o tipo de objeto da iteração não importa, é um nome de variável. Se você declarar antes que umLapis como Lápis e na lista tiver um objeto do tipo Caderno vai ser lançada uma exceção. Na abordagem usando instanceof você se preocupa com o tipo de dado e faz o que quer fazer com cada um ( dentro podes usar um cast e transformar na classe que você quiser e assim acessar métodos e atributos convenientes ). Usando a segunda você não se importa com o tipo pois para você todos são do tipo Object e pronto.
Até![/quote]
Lembrando que o compilador de forma alguma deixará voce tentar fazer um cast de um objeto que de nenhuma forma tenha relacionamento de herança.
ClassCastException só serão lançadas caso o objeto de referência seja parente do objeto da instância.
Com a utilização do instanceof voce terá uma maneira segura de saber para qual objeto voce poderá efetuar o cast. Por exemplo:
[code]
public class Teste {
public static void main(String[] args) {
List listaMaterialEscolar = new ArrayList();
listaMaterialEscolar.add(new Caderno());
listaMaterialEscolar.add(new Lapis());
listaMaterialEscolar.add(new Borracha());
for (Object item : listaMaterialEscolar) {
if (item instanceof Lapis) {
Lapis l = (Lapis) item; // sem problemas; tenho a certeza de que item se refere a um objeto Lapis
// faca algo com o lapis
} else if (item instanceof Caderno) {
Caderno c = (Fichario) item; // compila; Fichario É-UM Caderno;
c.folhear(); // nenhum problema aqui; a referencia a Caderno enxerga o metodo folhear
c.adicionarFolhas(1); // OPA! problema!; não compila; a variavel de referencia é de um objeto
// Caderno e não Fichario! ou seja Caderno não tem o método adicionarFolhas
// para isso funcionar, o cast deve ser feito na referencia e nao na instancia;
Fichario f = (Fichario) f;
f.adicionarFolhas(1); // Aqui sim!!! compila!! e não lança nenhuma exceção
Lapis l = (Lapis) item; // compila; porém lança uma ClassCastException em runtime
} else if (item instanceof Borracha) {
// faca algo com a borracha
} else {
// algum codigo assustador aqui
}
}
}
}
class Lapis {}
class Caderno {
public void folhear() { }
}
class Borracha {}
class Fichario
extends Caderno {
public void adicionarFolhas(int qtde) {}
}[/code]
At.