Каковы различия между & ldquo; универсальным & rdquo; типы в C ++ и Java?

Я думаю, что это связано с тем, что в случае не виртуального метода используется тип времени компиляции переменной, в которой вызывается метод.

У вас есть метод Foo, который не является виртуальным и поэтому этот метод вызывается.

Эта ссылка имеет очень хорошее объяснение http://msdn.microsoft.com/en-us/library/aa645767%28VS.71%29.aspx

146
задан JesseTG 4 April 2014 в 21:09
поделиться

9 ответов

Существует большая разница между ними. В C++ Вы не должны определять класс или интерфейс для универсального типа. Вот почему можно создать действительно родовые функции и классы с протестом более свободного ввода.

template <typename T> T sum(T a, T b) { return a + b; }

метод выше добавляет два объекта того же типа и может использоваться для любого типа T, который имеет "+" доступный оператор.

В Java необходимо определить тип, если Вы хотите звонить, методы на объектах передали, что-то как:

<T extends Something> T sum(T a, T b) { return a.add ( b ); }

В C++ универсальные функции/классы могут только быть определены в заголовках, так как компилятор генерирует различные функции для различных типов (что это вызывается с). Таким образом, компиляция медленнее. В Java компиляция не имеет крупного штрафа, но Java использует технику, названную "стиранием", где универсальный тип стирается во времени выполнения, таким образом, в Java во время выполнения на самом деле звонит...

Something sum(Something a, Something b) { return a.add ( b ); }

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

РЕДАКТИРОВАНИЕ: мнение выше о полноценности было записано младшим сам. Дженерики Java помогают с безопасностью типов, конечно.

128
ответ дан Radiodef 4 April 2014 в 21:09
поделиться

@Keith:

, Что код является на самом деле неправильным и кроме меньших незначительных сбоев (template опущенный, синтаксис специализации смотрит по-другому), частичная специализация не делает работа над шаблонами функций, только над шаблонами классов. Код однако работал бы без частичной шаблонной специализации, вместо этого с помощью простой перегрузки:

template <typename T> T sum(T a, T b) { return a + b; }
template <typename T> T sum(T* a, T* b) { return (*a) + (*b); }
1
ответ дан Konrad Rudolph 4 April 2014 в 21:09
поделиться

Другим преимуществом шаблонов C++ является специализация.

template <typename T> T sum(T a, T b) { return a + b; }
template <typename T> T sum(T* a, T* b) { return (*a) + (*b); }
Special sum(const Special& a, const Special& b) { return a.plus(b); }

Теперь при вызове суммы с указателями второй метод назовут при вызове суммы с неуказательными объектами, первый метод назовут, и если Вы будете звонить sum с Special объекты, третье назовут. Я не думаю, что это возможно с Java.

3
ответ дан 130e13a 4 April 2014 в 21:09
поделиться

Java (и C#) дженерики, кажется, простой механизм замены типа выполнения.
шаблоны C++ являются конструкцией времени компиляции, которые дают Вам способ изменить язык для удовлетворения потребностям. Они - на самом деле просто функциональный язык, который компилятор выполняет во время компиляции.

3
ответ дан Ferruccio 4 April 2014 в 21:09
поделиться

C++ имеет шаблоны. Java имеет дженерики, которые выглядят вид вида подобных шаблонов C++, но они очень, очень отличающиеся.

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

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

Думают о шаблонах C++ как действительно хороший макро-система и дженерики Java как инструмент для того, чтобы автоматически генерировать преобразования типа.

 

77
ответ дан Hearen 4 April 2014 в 21:09
поделиться

Существует большое объяснение этой темы в Дженерики Java и Наборы Maurice Naftalin, Philip Wadler. Я настоятельно рекомендую эту книгу. Заключить в кавычки:

Дженерики в Java напоминают шаблоны в C++.... Синтаксис сознательно подобен, и семантика сознательно отличаются.... Семантически, дженерики Java определяются стиранием, где, поскольку шаблоны C++ определяются расширением.

считайте полное объяснение здесь .

alt text
(источник: oreilly.com )

13
ответ дан Glorfindel 4 April 2014 в 21:09
поделиться

Другая функция, что шаблоны C++ имеют тот Java дженерики, не делает специализация. Это позволяет Вам иметь другую реализацию для определенных типов. Таким образом, у Вас может, например, быть высоко оптимизированная версия для интервал , все еще имея универсальную версию для остальной части типов. Или у Вас могут быть различные версии для указателя и неуказательных типов. Это пригождается, если Вы хотите воздействовать на разыменованный объект при вручении указателя.

15
ответ дан KeithB 4 April 2014 в 21:09
поделиться

Дженерики Java в широком масштабе отличающиеся от шаблонов C++.

В основном в шаблонах C++ в основном прославленный набор препроцессора/макроса ( Примечание: , так как некоторые люди кажутся не могущими постигать аналогию, я не говорю, что шаблонная обработка является макросом). В Java они - в основном синтаксический сахар для уменьшения шаблонного кастинга Объектов. Вот довольно достойное введение в шаблоны C++ по сравнению с дженериками Java .

Для разработки по этому вопросу: при использовании шаблона C++ Вы в основном создаете другую копию кода, так же, как если бы Вы использовали #define макрос. Это позволяет Вам делать, вещам нравится, имеют int параметры в шаблонных определениях, которые определяют размеры массивов и такого.

Java не работает как этот. В Java вся степень объектов от [1 111] java.lang. Объект так, предварительные дженерики, Вы написали бы код как это:

public class PhoneNumbers {
  private Map phoneNumbers = new HashMap();

  public String getPhoneNumber(String name) {
    return (String)phoneNumbers.get(name);
  }

  ...
}

, потому что все типы набора Java используемый Объект как их базовый тип, таким образом, Вы могли поместить что-либо в них. Java 5 катается вокруг и добавляет дженерики, таким образом, можно сделать вещи как:

public class PhoneNumbers {
  private Map<String, String> phoneNumbers = new HashMap<String, String>();

  public String getPhoneNumber(String name) {
    return phoneNumbers.get(name);
  }

  ...
}

И это - все Дженерики Java: обертки для кастинга объектов. Поэтому Дженерики Java не усовершенствованы. Они используют стирание типа. Это решение было принято, потому что Дженерики Java пришли настолько поздно в части, что они не хотели повреждаться, обратная совместимость (Map<String, String> применимо каждый раз, когда Map требуется). Сравните это с.Net/C#, где стирание типа не используется, который приводит ко всем видам различий (например, можно использовать типы примитивов и IEnumerable и IEnumerable<T> перенос никакое отношение друг к другу).

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

Вот почему Дженерики Java называют синтаксический сахар .

, Но это решение о том, как сделать, дженерики имеют сильные воздействия так так, чтобы (превосходный) дженерики FAQ Java возникли для ответа на многих, многие люди вопросов имеют о Дженериках Java.

шаблоны C++ имеют много функций, которые не делают Дженерики Java:

, Например:

public class ObservableList<T extends List> {
  ...
}

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

Кроме различий с дженериками, для полноты, вот основное сравнение C++ и Java другой ).

И я могу также предложить Взгляды в Java. Как программист на C++ много понятий как объекты уже будет второй натурой, но существуют тонкие различия, таким образом, может стоить иметь вводный текст, даже если Вы просматриваете части.

Многое из того, что Вы изучите при изучении Java, является всеми библиотеками (и стандарт - что прибывает в JDK - и нестандартный, который включает наиболее часто используемые вещи как Spring). Синтаксис Java является более подробным, чем синтаксис C++ и не имеет большого количества функций C++ (например, перегрузка оператора, множественное наследование, механизм деструктора, и т.д.), но это строго не делает это подмножеством C++ также.

119
ответ дан Makoto 4 April 2014 в 21:09
поделиться

В основном, AFAIK, шаблоны C++ создают копию кода для каждого типа, в то время как дженерики Java используют точно тот же код.

Да, можно сказать , что шаблон C++ эквивалентен Java, универсальному понятие (хотя более правильно должен был бы сказать, что дженерики Java эквивалентны C++ в понятии)

, Если Вы знакомы с шаблонным механизмом C++, Вы могли бы думать, что дженерики подобны, но подобие является поверхностным. Дженерики не генерируют новый класс для каждой специализации, и при этом они не разрешают “template метапрограммирование. ”

от: Дженерики Java

5
ответ дан OscarRyz 4 April 2014 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: