Dúvida Generics

7 respostas
Lelis_el_Quatilas

Qual a diferença na instanciação?

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

7 Respostas

mchiareli
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

Lelis_el_Quatilas

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?

A

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é

R

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???

sergiotaborda

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???

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:

ViniGodoy

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???

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.

T
sergiotaborda:
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 ).

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.

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.
    }
}
Criado 17 de junho de 2007
Ultima resposta 18 de jun. de 2007
Respostas 7
Participantes 7