В 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;
в то время как с примером объекта это возможно.