Dúvida Generics

Qual a diferença na instanciação?

        ArrayList array1 = new ArrayList<Integer>();
        ArrayList array2 = new ArrayList();
ArrayList<Integer> array1 = new ArrayList<Integer>();

Todo objeto que voce for adicionar add() devera ser do tipo Integer ou o compilador vai reclamar.

Ao chamar o metodo get() o objeto retornado será sempre do tipo Integer, e vc não precisa fazer o cast

ao contrario de

ArrayList array2 = new ArrayList();

que ira trabalhar com o tipo Object, add(Object obj) get() Object

Mchiareli, valeu a tentativa, mas repare que os dois são referências para tipos brutos (não genéricos), mas a instanciação(o comando depois da atribuição) é que difere. Nos dois casos eu trabalho com tipos Object, então, qual a diferença dos dois?

Bom, em runtime não existe diferença nenhuma. Os Generics são todos interpretados em tempo de compilação.
O que vai acontecer nesse seu código é que o compilador vai te dar warnings falando sobre unchecked exceptions. Ou se vc compilar com -Xlint, o compilador vai tratar os warnings como erros.
A idéia dos Generics é poupar trabalho ao programador, evitando que vc tenha que ficar fazendo instanceof e cast toda vez que for retirar algum Objeto do seu ArrayList, e evitando algum Runtime Exception se vc esquecer de colocar o instanceof, fazer o cast, etc.
O que o compilador faz, na verdade, quando interpreta os Generics é colocar os casts no codigo para vc.

André

pessoal, e se eu fizer ArraList<integer, String> eu tou dizendo que o objeto aceita Integer OU String ou é feito array bidimensional onde neste caso a linha seria Integer e a Coluna seria String???
ou ainda um terceiro caso onde continua a ideia de Array simples porem eu posso adicioar ao mesmo tempo Integer e String???

[quote=RaphaelSantos]pessoal, e se eu fizer ArraList<integer, String> eu tou dizendo que o objeto aceita Integer OU String ou é feito array bidimensional onde neste caso a linha seria Integer e a Coluna seria String???
ou ainda um terceiro caso onde continua a ideia de Array simples porem eu posso adicioar ao mesmo tempo Integer e String???[/quote]

Nenhuma das hipoteses. Esse código simplesmente vai dar erro.

A forma de dizer para aceitar mais do que uma classe é usando operador & (A assinatura genérica lê-se como “Aceita Integer E String E …” Por isso operador logico ).

Só que isso não faz sentido na ArrayList. Isso é usado para métodos genéricos. Não sei sequer se funciona para ArrayList , mas experimente e diga-nos o resultado :wink:

[quote=RaphaelSantos]pessoal, e se eu fizer ArraList<integer, String> eu tou dizendo que o objeto aceita Integer OU String ou é feito array bidimensional onde neste caso a linha seria Integer e a Coluna seria String???
ou ainda um terceiro caso onde continua a ideia de Array simples porem eu posso adicioar ao mesmo tempo Integer e String???[/quote]

Neste caso, as opções disponíveis são:

  1. Fazer uma lista com uma superclasse das classes envolvidas: no caso Object. Mas você terá que recorrer a casts.

  2. Fazer uma lista de uma outra classe, que tenha como dois atributos um valor Integer e outro String.

  3. Fazer duas listas, uma de String e outra de Integer.

Bom, na verdade o “&” é usado porque não dava para usar o “,” (explicação do Gilad Bracha); não serve para o que você quer.

[code]
class Veiculo {
}

interface Aquatico {
void navegar();
}

interface Aereo {
void voar();
}

class Navio extends Veiculo implements Aquatico {
public void navegar() {}
}

class Aviao extends Veiculo implements Aereo {
public void voar() {}
}

class Hidroaviao extends Aviao implements Aquatico {
public void navegar() {}
}

class Pato implements Aquatico, Aereo {
public void navegar() {}
public void voar() {}
}

class TesteGenericsAvancado {
// Note que “extends Aquatico & Aereo” corresponde
// à declaração “implements Aquatico, Aereo”.
// O “&” serve na verdade para substituir o “,”.
public <T extends Aquatico & Aereo> void viagem (T t) {
t.navegar(); // equivale a ((Aquatico) t).navegar();
t.voar(); // equivale a ((Aereo) t).voar();
}

public static void main(String[] args) {
     TesteGenericsAvancado tga = new TesteGenericsAvancado();
     tga.viagem (new Hidroaviao());
     tga.viagem (new Pato());
     tga.viagem (new Navio()); // dá erro de compilação 
                                     // uma vez que Navio não é Aereo.
}

}[/code]