В Java, когда я должен использовать «Объект o» вместо универсальных? - PullRequest
10 голосов
/ 10 декабря 2008

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

class example <T>
{
    ...

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

или

class example
{
    ...

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 10 декабря 2008

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

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

6 голосов
/ 10 декабря 2008

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

3 голосов
/ 10 декабря 2008

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

Тем не менее, Java не предлагает дисперсии параметров, поэтому в некоторых ситуациях вам придется переопределять предварительные функции, такие как equals, compareTo и т. Д., Где вам придется использовать Objects.

0 голосов
/ 10 декабря 2008

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

Относительно этого вашего пункта

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

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

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

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

0 голосов
/ 10 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...