a) List carros = new ArrayList();
Quando você define um atributo com o tipo Generico, a criação do objeto deve possuir o mesmo tipo. Se isso fosse permitido você poderia inserir um carro qualquer no list de carros Trabant, e daria uma exception em tempo de execução.
f) List<? extends Carro> carros = [color=red]new ArrayList<? extends Carro>();[/color]
Não pode ser usado curinga no lado da criação do Objeto.
Eu acho que é isso!!!
Valeu
G
gk-bgh
danielbussade:
Fala galera blz, estava fazendo um simulado da Caelum no site, e parei na seguinte questão:
Agora alguém pode me explicar porque a letra A, e a letra F não está correta???
Valeu!!
Att
a) List carros = new ArrayList();
Não compila porque é diferente de . Os dois tipos genéricos tem que ser iguais.
f)f) List<? extends Carro> carros = new ArrayList<? extends Carro>();
Você não pode usar o <?> na criação do objeto. Só na DECLARAÇÃO.
[]s
Gunnar
Raff
Daniel é o seguinte o compilador para genericos ele vefirica os tipos em tempo de compilação e não em tempo de execução como é feito no caso de arrays Animal[] ani = new Dog[3]… Isso pode ser feito com arrays porque o compilador se preocupara com o tipo em tempo de execução…
agora List<Animal> ani = new ArrayList<Dog>()// não dar ser por que o compilador verifica tipo em tempo de compilação.
Obs: Assuma que Animal é superClasse de Dog.
Raff
Espero ter ajudado!!!
Raff
publicstaticvoidteste(Animal[]ani){ani[2]=newCat();// isso vai compilar ???}publicstaticvoidmain(String...args){Animal[]cat=newDog[3];teste(cat);}
Daniel isso vai compilar, vai causar um exceção ???
G
gk-bgh
Muito boa a questão Raff.
Eu já esperava que compilaria sem problemas. Só não esperava o exception em tempo de execução.
[]s
Gunnar
Raff
verdade esses tipo de questoes são muito boas mesmo !Obrigado !
T
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:
importjava.util.*;interfaceAnimal{}classCatimplementsAnimal{}classDogimplementsAnimal{}classTesteArrays{publicstaticvoidteste(Animal[]ani){// Isto compila mas provoca uma exceção ao rodar:// 'Exception in thread "main" java.lang.ArrayStoreException: Cat'ani[2]=newCat();// isso vai compilar ???}publicstaticvoidmain(String...args){Animal[]cat=newDog[3];teste(cat);// isto compila...List<?extendsAnimal>dogs=newArrayList<Dog>();// mas (que seria uma tradução de ani[2] = new Cat()) // não compila...dogs.set(2,newCat());// nem isto (que seria uma tradução direta de// Animal[] cat = new Dog[3];) compila.List<Animal>animals=newArrayList<Dog>();// isto nem compila}}
danielbussade
Valeu Raff, pela explicação agora sim deu pra entender legal, neste seu caso com o thingol respondeu:
publicstaticvoidteste(Animal[]ani){ani[2]=newCat();// isso vai compilar ??? }publicstaticvoidmain(String...args){Animal[]cat=newDog[3];teste(cat);}
Compila normalmente, mas quando ele vai tentar insntanciar a posicão 2 do vetor com new Cat dará erro de excecução, pois ele só aceita referencias de Dog.
Certo??
Att
Raff
É isso ai daniel
Raff
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:
importjava.util.*;interfaceAnimal{}classCatimplementsAnimal{}classDogimplementsAnimal{}classTesteArrays{publicstaticvoidteste(Animal[]ani){// Isto compila mas provoca uma exceção ao rodar:// 'Exception in thread "main" java.lang.ArrayStoreException: Cat'ani[2]=newCat();// isso vai compilar ???}publicstaticvoidmain(String...args){Animal[]cat=newDog[3];teste(cat);// isto compila...List<?extendsAnimal>dogs=newArrayList<Dog>();// mas (que seria uma tradução de ani[2] = new Cat()) // não compila...dogs.set(2,newCat());// nem isto (que seria uma tradução direta de// Animal[] cat = new Dog[3];) compila.List<Animal>animals=newArrayList<Dog>();// isto nem compila}}
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:
importjava.util.*;interfaceAnimal{}classCatimplementsAnimal{}classDogimplementsAnimal{}classTesteArrays{publicstaticvoidteste(Animal[]ani){// Isto compila mas provoca uma exceção ao rodar:// 'Exception in thread "main" java.lang.ArrayStoreException: Cat'ani[2]=newCat();// isso vai compilar ???}publicstaticvoidmain(String...args){Animal[]cat=newDog[3];teste(cat);// isto compila...List<?extendsAnimal>dogs=newArrayList<Dog>();// mas (que seria uma tradução de ani[2] = new Cat()) // não compila...dogs.set(2,newCat());// nem isto (que seria uma tradução direta de// Animal[] cat = new Dog[3];) compila.List<Animal>animals=newArrayList<Dog>();// isto nem compila}}
eu achava que isso compilaria sim pois a classe dog implementa a interface Animal..
Estou errado ? ou Certo ?
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.