C # против Java дженериков

голоса
105

Я слышал, что реализация Java генериков не так хорошо, как реализация C #. В том, что синтаксис выглядит так же, что это то, что некачественная о реализации Java, или это религиозная точка зрения?

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


3 ответов

голоса
137

ссылка streloksi в делает большую работу ломает различие. Быстрое и грязное резюме , хотя это ...

С точки зрения синтаксиса и использования. Синтаксис примерно такой же между языками. Несколько причуды здесь и там (в первую очередь в ограничениях). Но в принципе, если вы можете прочитать один, вы, вероятно, можете прочитать / использовать другие.

Самая большая разница, хотя в реализации.

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

C # с другой стороны, в силу CLR, реализовать дженерики все они вплоть до байт-код. CLR сделал несколько изменений взлома для поддержки дженерик в 2.0. Преимущества улучшения производительности, глубокие проверки безопасности типа и отражение.

Опять же , при условии , ссылка имеет гораздо больше глубины пробоя Я призываю вас читать

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

голоса
31

Разница сводится к дизайнерскому решению по Microsoft и Sun.

Обобщения в Java реализуются через тип стирание компилятора, что означает , что проверка типа происходит во время компиляции, а также информация о типе удаляется. Этот подход был принят , чтобы сохранить унаследованный код совместим с новым кодом с помощью дженериков:

From The Java Обучающие программы , Дженерики: Тип Erasure :

Когда общий тип экземпляра, компилятор преобразует эти типы с помощью метода, называемого типа стирания - процесс, в котором компилятор удаляет всю информацию, относящуюся к параметрам типа и аргументам типа в пределах класса или методы. Тип стирания позволяет приложениям Java, которые используют дженерики для поддержания бинарной совместимости с Java-библиотек и приложений, которые были созданы до дженериков.

Однако, с воспроизведенными в C # (.NET) , не существует типа стирания компилятора, и проверяет типа выполняется во время выполнения. Это имеет свои преимущества, сохраняется информация о типе в скомпилированный код.

Материал из Википедии:

Этот выбор дизайна заемные средств для обеспечения дополнительной функциональности, например, позволяя отражения с сохранением общих типов, а также устранить некоторые из ограничений стирания (например, будучи не в состоянии создавать общие массивы). Это также означает, что производительность не хит от времени выполнения забросов и обычно дорогих переходов бокса.

Вместо того, чтобы сказать «.NET дженерики лучше, чем Java дженериков», следует искать в разнице в подходе к реализации дженериков. В Java, оказывается, что сохранение совместимости является высоким приоритетом, в то время как в .NET (при введении в версии 2.0), реализующий полное преимущество использования дженериков было более высоким приоритетом.

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

голоса
4

Также найдено этот разговор с Хейлсберг , что может быть интересно тоже. Суммируя очки , которые Хейлсберг сделаны с некоторыми дополнительными примечаниями: Java генерик были сделаны для обеспечения максимальной совместимости с существующей JVM , которая привела к нескольким нечетным вещам , по сравнению с реализацией , которые вы видите в C #:

  • Тип реализации Erasure силы , чтобы представлять каждое родовое параметризованное значение как Object. В то время как компилятор обеспечивает автоматические слепки между Objectи более конкретным типом, это не снимает негативное воздействие слепков типа и бокс на производительности (например , Objectналивают определенный тип MyClassили должны intбыли быть зажато в Integer, которые было бы еще более серьезным для C # /. NET , если они следовали типа стирания подход из - за определенных пользователем типов значений). Как сказал Андерс: «Вы не получаете какой - либо эффективности выполнения» (что реифицированные дженерики включить в C #)

  • Тип стирание делает доступной информацию во время компиляции не доступных во время выполнения . То , что раньше List<Integer>становится просто Listбез возможности восстановить общий параметр типа во время выполнения. Это затрудняет для создания отражения или динамического кода поколения сценариев вокруг Java дженериков. Более поздний SO ответ показывает путь вокруг него с помощью анонимных классов. Но без уловок, что - то вроде генерации коды во время выполнения с помощью отражения , которое получает элементы из одного экземпляра коллекции и помещает его в другой экземпляр коллекции может не во время выполнения во время выполнения динамически сгенерированного кода: отражение не помогает поймать несоответствие в List<Double>сравнении List<Integer>в этих ситуациях ,

Но +1 за ответ ссылается Джонатан Прайора блоге .

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

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