Sobre generics

Estava estudando quando vi esta questao que resulta em 3 testei no eclipse e tal mais no livro da kathy sierra diz que 6. HashSet<Object> hs = new HashSet<Object>(); so deveria aceitar objects e não subclasses de object no caso String e a propria classe podem me ajudar a entender isto por que compila e roda sendo que estou passando subclasses de object se usar wildcards ou qualquer outra coisa?

[code]Given:

  1. import java.util.*;
  2. public class WrappedString {
  3. private String s;
  4. public WrappedString(String s) { this.s = s; }
  5. public static void main(String[] args) {
  6. HashSet hs = new HashSet();
  7. WrappedString ws1 = new WrappedString(“aardvark”);
  8. WrappedString ws2 = new WrappedString(“aardvark”);
  9. String s1 = new String(“aardvark”);
  10. String s2 = new String(“aardvark”);
  11. hs.add(ws1); hs.add(ws2); hs.add(s1); hs.add(s2);
  12. System.out.println(hs.size()); } }[/code]

[quote=Diabo Loiro]Estava estudando quando vi esta questao que resulta em 3 testei no eclipse e tal mais no livro da kathy sierra diz que 6. HashSet<Object> hs = new HashSet<Object>(); so deveria aceitar objects e não subclasses de object no caso String e a propria classe podem me ajudar a entender isto por que compila e roda sendo que estou passando subclasses de object se usar wildcards ou qualquer outra coisa?

[code]Given:

  1. import java.util.*;
  2. public class WrappedString {
  3. private String s;
  4. public WrappedString(String s) { this.s = s; }
  5. public static void main(String[] args) {
  6. HashSet hs = new HashSet();
  7. WrappedString ws1 = new WrappedString(“aardvark”);
  8. WrappedString ws2 = new WrappedString(“aardvark”);
  9. String s1 = new String(“aardvark”);
  10. String s2 = new String(“aardvark”);
  11. hs.add(ws1); hs.add(ws2); hs.add(s1); hs.add(s2);
  12. System.out.println(hs.size()); } }[/code][/quote]

O que você não pode fazer é isso:

HashSet<Object> hs = new HashSet<String>();

No livro da Kathy ela explica que isso não pode ocorrer pois o Generics existe apenas em tempo de compilação.
Digamos que vc faça : HashSet set = new HashSet ();
Desse modo, seu objeto real armazena somente dogs, porém a variável de referência irá permitir que vc adicione quaisquer outros objetos que também extendam Animal.
Em tempo de execução já dá pra imaginar os problemas né.

E o que me diz de esta parte do livro que diz que o polimorfismo nao funciona direito com tipos genericos
veja por favor fiquei realmente confuso neste cenario.

[quote=Diabo Loiro]E o que me diz de esta parte do livro que diz que o polimorfismo nao funciona direito com tipos genericos
veja por favor fiquei realmente confuso neste cenario.
[/quote]

Essa página está explicando o uso dos coringas. Você não entendeu pra que serve o coringa?

Qual parte fala que o polimorfimo não funciona direito com Generics?

eu vou digitar a parte que é pra vc entender

“parte grifada do printscreen”
“se voce nao vir o ponto de interrogação então significa que deve ser usado o tipo especificado e absolutamente nada alem dele.” e em baixo ela da exemplos que um list so pode adicionar nele list e não List".

não tem nada a ver com coringas.
eu seu que não se pode fazer

List a =new ArrayList();

o caso é que

List d=new ArrayList();
so pode aceitar dogs e nao subclasses e la em cima no exemplo
eu criei um HashSet de Object e adicionei 2 subclasses String e WrappedString e compilou rodou e resultou em 3 me confundindo totalmente

1. Given: 2. 1. import java.util.*; 3. 2. public class WrappedString { 4. 3. private String s; 5. 4. public WrappedString(String s) { this.s = s; } 6. 5. public static void main(String[] args) { 7. 6. HashSet<Object> hs = new HashSet<Object>(); 8. 7. WrappedString ws1 = new WrappedString("aardvark"); 9. 8. WrappedString ws2 = new WrappedString("aardvark"); 10. 9. String s1 = new String("aardvark"); 11. 10. String s2 = new String("aardvark"); 12. 11. hs.add(ws1); hs.add(ws2); hs.add(s1); hs.add(s2); 13. 12. System.out.println(hs.size()); } }

Cara, você ainda não entendeu.

Veja, se você tem uma variável de referência do tipo HashSet <Object> você pode adicionar a esse HashSet qualquer objeto java! Pois todos são Object.

Como te disse, o que vc não pode fazer é isso aqui: HashSet <Object> set = new HashSet <String> (). Ou seja, o que você não pode fazer é fazer que uma variável de referência
do tipo HashSet <Object> faça referência a um objeto do tipo HashSet <String>.

Opa velinho fiz algums testes e entendi o que quis dizer foi um mal entendimento meu mais so para fica claro qual era minha duvida. veja abaixo eu estava pensando que funcionava igual tanto no add quando na chamanda de metodo pode ver que o metodo a baixo da pau, pois não aceita a sub classe.

porem vlw pela atenção espero que tenha entendido minha duvida.

Entendi sim. Eu tive a mesma dúvida também! Abraço.