"Outro tópico legal."

"As surpresas continuam chegando! É meu aniversário?"

"Hoje falarei sobre genéricos. Genéricos são tipos que possuem um parâmetro. Em Java, as classes container permitem que você indique o tipo de seus objetos internos."

"Quando declaramos uma variável genérica, indicamos dois tipos em vez de um: o tipo da variável e o tipo dos dados que ela armazena."

"ArrayList é um bom exemplo. Quando criamos um novo objeto ArrayList, é conveniente indicar o tipo dos valores que serão armazenados dentro desta lista."

Código Explicação
ArrayList<String> list = new ArrayList<String>();
Crie uma variável ArrayList chamada list.
Atribua um objeto ArrayList a ele.
Esta lista só pode armazenar objetos String .
ArrayList list = new ArrayList();
Crie uma variável ArrayList chamada list.
Atribua um objeto ArrayList a ele. Esta lista pode armazenar quaisquer valores .
ArrayList<Integer> list = new ArrayList<Integer>();
Crie uma variável ArrayList chamada list.
Atribua um objeto ArrayList a ele.
Esta lista só pode armazenar Integere intvalores.

"Parece superinteressante. Especialmente a parte sobre armazenar valores de qualquer tipo ."

"Parece apenas uma coisa boa. Na realidade, se colocarmos strings em um ArrayList em um método e esperarmos que ele contenha números em outro método, o programa travará (terminará com um erro)."

"Eu vejo."

"Por enquanto, não vamos criar nossas próprias classes com parâmetros de tipo. Vamos apenas usar as existentes."

"Qualquer classe pode ser um parâmetro de tipo, mesmo uma que eu escrevo?"

"Sim. Qualquer tipo, exceto para tipos primitivos. Todos os parâmetros de tipo devem herdar da classe Object."

" Quer dizer que não posso escrever ArrayList<int>? "

"Na verdade, você não pode. Mas os desenvolvedores Java escreveram classes wrapper para cada um dos tipos primitivos. Essas classes herdam Object . É assim que parece:"

tipo primitivo Aula Lista
int inteiro ArrayList< Inteiro >
dobro Dobro ArrayList< Duplo >
boleano boleano ArrayList< Booleano >
Caracteres Personagem ArrayList <Caractere> _
byte Byte ArrayList< Byte >

"Você pode facilmente atribuir classes primitivas e seus análogos (classes wrapper) entre si:"

Exemplos
int a = 5;
Integer b = a;
int c = b;
Character c = 'c';  //the literal c is a char
char d = c;
Byte b = (byte) 77;  // The literal 77 is an int
Boolean isOk = true;  // the literal true is a boolean
Double d = 1.0d;  // The literal 1.0d is a double

"Ótimo. Acho que vou tentar usar ArrayList com mais frequência."