Как дженерики Java отличаются от шаблонов C++? Почему я не могу использовать интервал в качестве параметра?

Вы можете использовать аннотацию формул. Если вы используете Hibernate, вы можете использовать приведенный ниже код в соответствии с этой ссылкой :

private String theApType;

@Formula("apType")
String getTheApType() {
    return theApType;
}

Конечно, вы сможете использовать его в своих запросах.

51
задан olovb 27 April 2015 в 10:33
поделиться

6 ответов

Java generics are so different from C++ templates that I am not going to try to list the differences here. (See What are the differences between “generic” types in C++ and Java? for more details.)

In this particular case, the problem is that you cannot use primitives as generic type parameters (see JLS §4.5.1: "Type arguments may be either reference types or wildcards.").

However, due to autoboxing, you can do things like:

List<Integer> ints = new ArrayList<Integer>();
ints.add(3); // 3 is autoboxed into Integer.valueOf(3)

So that removes some of the pain. It definitely hurts runtime efficiency, though.

66
ответ дан 7 November 2019 в 09:59
поделиться

Причина того, что int не работает, заключается в том, что вы не можете использовать примитивные типы в качестве общих параметров в Java.

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

Java имеет тенденцию сосредотачиваться на определении общего. То есть валидность общего определения проверяется только с учетом кода в универсальном. Если параметры не ограничены должным образом, определенные действия с ними не могут быть выполнены. Фактический тип, с которым он в конечном итоге вызывается, не рассматривается.

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

25
ответ дан 7 November 2019 в 09:59
поделиться

You can't use primitives as type parameters in Java. Java's generics worth through type erasure, meaning that the compiler checks that you're using the types as you've defined them, but upon compilation, everything is treated as an Object. Since int and other primitives aren't Objects, they can't be used. Instead, use Integer.

3
ответ дан 7 November 2019 в 09:59
поделиться

Вы можете попробовать TIntArraList из GNU Trove, который будет действовать как ArrayList значений типа int.

1
ответ дан 7 November 2019 в 09:59
поделиться

that's because int is a primitive, it is a known issue.

If you really wanted to, you can subclass/write your own collection that can do that.

3
ответ дан 7 November 2019 в 09:59
поделиться

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

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

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

Шаблоны более мощные, чем универсальные; первый фактически является другим языком, встроенным в c ++, тогда как, насколько мне известно, последний полезен только в контейнерах

от необходимости более одного скомпилированного экземпляра.

Шаблоны более мощные, чем универсальные шаблоны; первый фактически является другим языком, встроенным в c ++, тогда как, насколько мне известно, последний полезен только в контейнерах

от необходимости более одного скомпилированного экземпляра.

Шаблоны более мощные, чем универсальные шаблоны; первый фактически является другим языком, встроенным в c ++, тогда как, насколько мне известно, последний полезен только в контейнерах

9
ответ дан 7 November 2019 в 09:59
поделиться
Другие вопросы по тегам:

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