[quote=Raff][quote=thingol]Compila e dá erro de execução.
Isso foi um dos erros da definição da linguagem Java, e foi infelizmente copiado no .NET; na verdade, esse problema foi percebido, e evitado na definição de generics. Com generics tal problema não pode ocorrer:
[code]
import java.util.*;
interface Animal {}
class Cat implements Animal {}
class Dog implements Animal {}
class TesteArrays {
public static void teste(Animal [] ani){
// Isto compila mas provoca uma exceção ao rodar:
// 'Exception in thread "main" java.lang.ArrayStoreException: Cat'
ani[2] = new Cat();// isso vai compilar ???
}
public static void main(String… args){
Animal[] cat = new Dog[3];
teste(cat);
// isto compila...
List<? extends Animal> dogs = new ArrayList<Dog>();
// mas (que seria uma tradução de ani[2] = new Cat())
// não compila...
dogs.set (2, new Cat());
// nem isto (que seria uma tradução direta de
// Animal[] cat = new Dog[3];) compila.
List<Animal> animals = new ArrayList<Dog>(); // isto nem compila
}
}
[/code][/quote]
thingol por que isso não compila??
eu achava que isso compilaria sim pois a classe dog implementa a interface Animal…
Estou errado ? ou Certo ?
[/quote]
compila sim.
<? extends Animal> aceita qualquer coisa do tipo Animal ou suas subclasses. Em outras palavras, qualquer coisa que SEJA um Animal.
A única observação é que quando você utiliza <? extends Animal> você não pode adicionar elementos ao collection, a não ser que utilize <? super Dog>. Ai você pode adicionar elementos ao collection, já que você sabe de antemão o que vai ser adicionado. Outra restrição é que esses elementos tem que ser do tipo DOG (no meu exemplo). Se for de qualquer outro tipo dá erro de compilação.
[code]
class Animal{
}
class Dog extends Animal{}
public class G1{
public static void main(String[] args){
List<? super Dog> l = new ArrayList<Object>();
//l.add(new Animal());
//l.add(new Object());
l.add(new Dog());
}
}[/code]
[]s
Gunnar