В Java, когда я должен использовать «Object O» вместо дженериков?

голоса
10

Например, я мог бы написать любой из них:

class example <T>
{
    ...

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

или

class example
{
    ...

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

Есть ли signficant разница между 2 с точки зрения производительности? С дженерик я мог ограничить тип параметра и при втором подходе я предполагаю, что это не было бы необходимо определить тип объекта, как он будет создан.

Кроме того, при втором подходе я мог в основном вставить что-либо в классе, не так ли? В то время как при использовании дженериков каждый элемент в классе был бы того же типа.

Все остальное я не хватает?

Задан 10/12/2008 в 03:48
источник пользователем
На других языках...                            


5 ответов

голоса
9

Единственная причина, чтобы написать последнее, если вы должны быть направлены на более раннюю JVM. Обобщения реализуются по типу-стиранию, поэтому они не имеют никакого влияния выполнения - только добавили компиляцию проверки времени, которая улучшит ваш код.

Конечно, если вам нужна коллекция, которая держит любой старый объект, или смесь из нескольких, которые не имеют общий суперкласс, вам нужно простое изменение объекта (но тогда ваш класс по-прежнему может быть общим и экземпляром с новым ... < Объект>).

Ответил 10/12/2008 в 03:54
источник пользователем

голоса
6

Я думаю , вы в значительной степени прибил его. Там нет разницы в производительности. Дженерики рационализировать прочь ( тип Erasure ) при компиляции кода, и уже не существует во время выполнения. Они просто добавить слепки при необходимости и делать проверку типов , как вы заявили. Нил Gafter написал хороший обзор того , как они работают, текущие проблемы с Дженерики и как они могут быть решены в следующей версии Java: http://gafter.blogspot.com/2006/11/reified-generics-for- java.html

Ответил 10/12/2008 в 03:55
источник пользователем

голоса
3

Там не должно быть разницы в производительности.

Однако, Java не предлагает параметр дисперсии, таким образом, есть ситуации, когда будут доминирующими функциями предварительного генерики, такие как равные, CompareTo и т.д., где вы должны будете использовать объекты.

Ответил 10/12/2008 в 04:06
источник пользователем

голоса
0

Что касается производительности, я согласен с вышеперечисленными людьми.

Относительно эту точку ваших

«Кроме того, при втором подходе я мог в основном вставить что-либо в классе, правильно? В то время как с обобщениями каждый элемент в классе был бы того же типа.»

Еще одно преимущество дженериков есть проверка типа для назначения самого примера экземпляра.

Скажем, например, у вас были пример е1 и другой пример е2, безопасность типа будет сохранена, и вы никогда не будете в состоянии сделать e1 = e2;

в то время как в примере объекта, который был бы возможен.

Ответил 10/12/2008 в 12:32
источник пользователем

голоса
0

Некоторые из встреч, где я должен был использовать «Object» вместо генериков были те принуждения, чем выбор. При работе с предварительно общим кодом или библиотеками, построенным вокруг предварительно родового апи, один имеет небольшой выбор. Динамические прокси, например, Proxy.newProxy () возвращает объект типа. Передача общего контекста (где контекст может быть что угодно) является еще одним экземпляром. Некоторые из моих друзей утверждают, что так хорошо, как не-дженериков. Что касается производительности, то, что не должно быть никаких накладных расходов, с учетом типа стирания.

Ответил 10/12/2008 в 10:37
источник пользователем

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