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

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

class example <T>
{
    ...

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

или

class example
{
    ...

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

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

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

Что-нибудь еще мне не хватает?

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Относительно этой точки

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

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

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

в то время как с примером объекта это возможно.