ArrayList e polimorfismo

Ola pessoal…
gostaria que me tirassem uma duvida

ArrayList myDogArrayList();

Dog aDog = new Dog();

myDogArrayList.add(aDog);

Dog d = myDogArrayList.get(0);

Se o objeto Dog herda od metodos de Object, porque nao pode ser compilado?? :?: :?:

Ao Object você pode atribuir qualquer tipo de dado, que seja,
quando você cria um ArrayList< Object > , você atribui um certo tipo de dado,
mas quando se utiliza de vários tipos de dados para somente um objeto,
você terá que fazer assim:


ArrayList< Object > myDogArrayList = new ArrayList< Object >();

myDogArrayList.add( Dog );
myDogArrayList.add( new Integer( 1 ) );
myDogArrayList.add( new Double( 2.343 ) );

Dog dog = new Dog();

//para cada um

dog = ( Dog ) myDogArrayList.get( 0 );

int num1 = myDogArrayList.get( 1 );

double num2 = myDogArrayList.get( 2 );

Você não declarou seu ArrayList parametrizado com Object? Então, só será possível retirar dele um objeto do tipo Object. Uma solução seria adicionar um cast (Dog). Desse jeito você não teria erro de compilação, mas poderia ter em tempo de execução (ClassCastException).

Nunca declare um ArrayList parametrizado com Object, utilize o objeto real que será manipulado ou Generics.

Do jeito que está o compilador toma como base que todos os elementos da sua lista são do tipo Object, logo , vc não terá acesso aos métodos de Dog.

Se vc tipar a sua lista como dog tipo

List<Dog> lista = new ArrayList<Dog>();

vai ter acesso aos métodos e atributos da classe Dog.

[quote=bKn]
Você não declarou seu ArrayList parametrizado com Object? Então, só será possível retirar dele um objeto do tipo Object. Uma solução seria adicionar um cast (Dog). Desse jeito você não teria erro de compilação, mas poderia ter em tempo de execução (ClassCastException).
Nunca declare um ArrayList parametrizado com Object, utilize o objeto real que será manipulado ou Generics.[/quote]

Depois que você entender o que o bKn disse com muita propriedade, aconselho a leitura do capitulo 5 do Java Effective.

[]'s
JL

Vlw pessoal…
acho que ja vi qual foi meu erro :wink:
Brigadão