Questão de Generics

4 respostas
marcelo_mococa

Boa Tarde Pessoal.

Estava fazendo o mock do site da caelum e fiquei com uma dúvida.

Veja a pergunta:

1 Collection c1 = new ArrayList();

2 Collection c2 = new ArrayList();

3 Collection<?> c3 = new ArrayList();

4 Collection c4 = new ArrayList();

5 Collection c5 = new ArrayList();

Quais linha não compilaram?
Nenhuma, todas compilam sem problemas.
Apenas as linhas 1,3,4,5.
Apenas as linhas 3,4,5.
Apenas as linhas 1,2.
Apenas as linhas 1,4,5

No mock a resposta certa é “Apenas as linhas 1,4,5”.

Copie o código e colei no eclipse para testar.
As únicas que não compilaram foram a 1 e 4.

o mock está errado?
Pela lógica parece que a linha 5 não deveria compilar mesmo. Pois é como se eu estivesse atribuindo Collection c5 = new ArrayList(); não é?

Atenciosamente
Marcelo Madeira.

4 Respostas

T

As linhas que não compilam são a 1 e a 4.

A 5 compila mas dá um warning (ou seja, a linha compila e o código é gerado, mas uma mensagem é apresentada).

Portanto o mock está um pouco confuso.

Eu diria que esse tipo de sutileza (diferenciar entre um erro e um warning) seria explicado melhor na prova: ele perguntaria se a linha tem erros ou warnings, não se tem problemas (poderia ter o “problema” de usar nome de variável curto :stuck_out_tongue: )

T

Aqui eu dou um exemplo do que pode ocorrer se você deixar passar em branco o warning da linha 5.
Mas repito: warning não é erro.

import java.util.*;

/**
 * Classe legada, que não posso converter para generics, mas tenho de usar
 */
class ClasseLegada {
    private List nomes;
    public ClasseLegada () {
        nomes = new ArrayList();
        nomes.add ("Maria Madalena");
        nomes.add ("João Evangelista");
    }
    /** Fui compilado em JDK 1.4 e prometo retornar uma lista de Strings. */
    public List getNomes() {
        return nomes;
    }
}

class TesteGenerics {
    
    public static void main(String[] args) {
        ClasseLegada cl = new ClasseLegada();
/*5*/    Collection&lt;String&gt; c5 = cl.getNomes();  // warning: [unchecked] unchecked conversion
        c5.add ("abraxas"); // ok - generics funcionando
//        c5.add (new Object()); // não deixa fazer - dá erro de compilação - generics funcionando
        cl.getNomes().add (new Object()); // é a mesma coisa, mas não dá erro de compilação.
        // dá o warning "[unchecked] unchecked call to add(E) as a member of the raw type java.util.List"
        // é por isso que ocorre o tal warning, porque isso abre "um buraco" nos testes de generics.
        System.out.println (c5); // vai imprimir: [Maria Madalena, João Evangelista, abraxas, java.lang.Object@82ba41]
        // ou seja, não é mais uma Collection&lt;String&gt;
    }
}
T

marcelo_mococa:
Instituto Tecnológico da Aeronáutica

Que eu saiba o nome é Instituto Tecnológico de Aeronáutica. Confirme isso em http://www.ita.br.

Note a diferença semântica: “da” quer dizer que é da (Força Armada) Aeronáutica; “de” quer dizer que é de (Tecnologia) Aeronáutica.

Se fosse “da” Aeronáutica, então você precisaria obrigatoriamente ser militar para concluir o curso (era preciso sê-lo para iniciar o curso, depois você passa para a reserva no 3o. ano).

marcelo_mococa

Pois é…
nos outros mocks que estava fazendo, vi que as perguntas diferenciam entre compilar com warning e sem warning.

Sobre o ITA, não sou aluno não, apenas trabalho em um projeto pra receita federal aqui.

Valeu pela ajuda.

Criado 30 de outubro de 2006
Ultima resposta 30 de out. de 2006
Respostas 4
Participantes 2