Em Java, quando devo usar "Object o" em vez de genéricos?

votos
10

Por exemplo, eu poderia escrever um desses:

class example <T>
{
    ...

    public void insert (T data)
    {
        ...
    }
}

ou

class example
{
    ...

    public void insert (Object o)
    {
        ...
    }
}

Existe uma diferença entre o signficant 2 em termos de desempenho? Com os genéricos eu poderia restringir o tipo de parâmetro e com a segunda abordagem que eu acho que não seria necessário definir o tipo do objeto como ele é criado.

Além disso, com a segunda abordagem que eu poderia basicamente insira nada para a classe, certo? Enquanto que com os genéricos cada elemento na classe seria do mesmo tipo.

Qualquer outra coisa que eu estou ausente?

Publicado 10/12/2008 em 03:48
fonte usuário
Em outras línguas...                            


5 respostas

votos
9

A única razão para escrever o último é se você deve ter como alvo uma JVM anteriormente. Os genéricos são implementados por tipo-apagamento, para que eles não têm impacto runtime - só acrescentou verificação de tempo de compilação que irá melhorar o seu código.

Claro, se você precisa de uma coleção que contém qualquer objeto de idade, ou uma mistura de vários que não têm uma superclasse comum, você precisa da variação objeto simples (mas então sua classe ainda pode ser genérica e instanciado com novo ... < Object>).

Respondeu 10/12/2008 em 03:54
fonte usuário

votos
6

Eu acho que você praticamente acertou em cheio. Não há diferença de desempenho. Genéricos são racionalizadas ( Tipo Erasure ) quando o código é compilado, e não existem mais em tempo de execução. Eles só adicionar moldes quando necessário e fazer verificação de tipo como você disse. Neal Gafter escreveu uma boa visão geral de como eles funcionam, dos problemas atuais com os genéricos e como eles poderiam ser resolvidos na próxima versão do Java: http://gafter.blogspot.com/2006/11/reified-generics-for- java.html

Respondeu 10/12/2008 em 03:55
fonte usuário

votos
3

Não deve haver uma diferença de desempenho.

No entanto, Java não oferece variação de parâmetros, de forma que há situações em que você vai ser substituindo funções pré-genéricos, como iguais, compareTo, etc. onde você terá que usar objetos.

Respondeu 10/12/2008 em 04:06
fonte usuário

votos
0

Alguns dos encontros onde eu tive que usar o 'objeto' em vez de genéricos foram os de compulsão do que de uma escolha. Ao trabalhar com código pré-genérico ou bibliotecas construídas em torno api pré-genérico, tem pouca escolha. proxies dinâmicas, por exemplo, Proxy.newProxy () retorna objecto tipo. Passando contexto genérico (onde um contexto pode ser qualquer coisa) é outro exemplo. Alguns dos meus amigos argumentam que são tão bons quanto não-genéricos. Tanto quanto o desempenho está em causa, não deve haver qualquer sobrecarga, considerando tipo de rasura.

Respondeu 10/12/2008 em 10:37
fonte usuário

votos
0

Com relação ao desempenho, eu concordo com as pessoas acima.

Em relação a este ponto de seu

"Além disso, com a segunda abordagem que eu poderia basicamente insira nada para a classe, certo? Considerando que, com os genéricos cada elemento na classe seria do mesmo tipo."

Mais uma vantagem de genéricos é que há uma verificação de tipo para atribuição do exemplo instância própria.

Digamos, por exemplo, você tinha um Exemplo e1 de e outro exemplo e2 de, segurança de tipo seria mantida e você nunca seria capaz de fazer e1 = e2;

enquanto que com o exemplo de objeto, isso seria possível.

Respondeu 10/12/2008 em 12:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more