Qual a diferença na instanciação?
ArrayList array1 = new ArrayList<Integer>();
ArrayList array2 = new ArrayList();
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
[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:
Fazer uma lista com uma superclasse das classes envolvidas: no caso Object. Mas você terá que recorrer a casts.
Fazer uma lista de uma outra classe, que tenha como dois atributos um valor Integer e outro String.
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]