Есть ли эквивалент Java или методология для ключевого слова typedef в C ++?

Исходя из фона C и C ++, я нашел разумное использование typedef невероятно полезным. Вы знаете способ достижения аналогичной функциональности на Java, будь то механизм Java, шаблон или какой-либо другой эффективный способ, которым вы пользовались?

Java имеет примитивные типы, объекты и массивы, и все. Нет typedefs.

Если это то, что вы имеете в виду, вы можете просто расширить class, который вы хотите ввести typedef, например:

 public class MyMap extends HashMap {} 

Нет никакого typedef в java от 1.6, что вы можете сделать, это сделать class-оболочку для того, что вы хотите, поскольку вы не можете подclassифицировать конечные classы (Integer, Double и т. Д.),

Действительно, единственное использование typedef, которое переносится в Javaland, – это псевдоним, то есть присвоение одного и того же classа нескольким именам. То есть, у вас есть class «A», и вы хотите, чтобы «B» ссылался на одно и то же. В C ++ вы будете делать «typedef BA»;

К сожалению, они просто не поддерживают его. Тем не менее, если вы контролируете все задействованные типы, вы можете нанести неприятный взлом на уровне библиотеки – вы либо расширяете B от A, либо имеете B, реализующий A.

Как уже упоминалось ранее,
В Java нет механизма typedef.
Я также не поддерживаю «поддельные classы» вообще, но здесь не должно быть строгого эмпирического правила:
Если ваш код, например, использует многократно и более «общий тип», например:

 Map> 

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

 //@Alias Map> NameToNumbers; 

А затем используйте в своем коде NameToNumbers и задайте перед компилятором задачу (ANT / Gradle / Maven) для обработки и генерации соответствующего Java-кода.
Я знаю, что некоторым из читателей этого ответа может показаться странным, но это то, сколько фреймворков реализовало «annotations» до JDK 5, это то, что делает проект lombok и другие фреймворки.

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

Checker Framework позволяет вам определить typedef в обратном соответствии. Я работаю даже для примитивных classов, таких как int и final classes, такие как String . Он не имеет накладных расходов во время выполнения и не нарушает тесты на равенство.

В псевдонимах типа Type и typedefs в руководстве Checker Framework описано несколько способов создания typedefs, в зависимости от ваших потребностей.

Возможно, это может быть другой возможной заменой:

 @Data public class MyMap { @Delegate //lombok private HashMap value; } 

В некоторых случаях привязка annotations может быть именно то, что вы ищете:

https://github.com/google/guice/wiki/BindingAnnotations

Или, если вы не хотите зависеть от Guice, может быть просто обычная аннотация.

Вы можете использовать Enum, хотя это семантически немного отличается от typedef, поскольку оно допускает только ограниченный набор значений. Другим возможным решением является именованный class-shell, например

 public class Apple { public Apple(Integer i){this.i=i; } } 

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

Typedef позволяет элементам неявно назначать типы, которыми они не являются. Некоторые люди пытаются обойти это с помощью расширений; прочитайте здесь, в IBM, для объяснения, почему это плохая идея.

Редактировать: В то время как вывод о сильном типе – полезная вещь, я не думаю (и надеюсь, что мы этого не увидим), увидев, что typedef выращивает уродливую голову на управляемых языках (когда-либо?).

Изменить 2: В C # вы можете использовать оператор using, подобный этому, в верхней части исходного файла. Он используется, поэтому вам не нужно делать второй показанный объект. Единственный раз, когда вы видите изменение имени, – это когда область вводит столкновение имен между двумя типами. Переименование ограничено одним файлом, за пределами которого каждый тип переменной / параметра, который использовал его, известен по его полному имени.

 using Path = System.IO.Path; using System.IO; 

В Java нет необходимости в typedef. Все это объект, за исключением примитивов. Нет указателей, только ссылок. Сценарии, в которых вы обычно используете typedefs, являются экземплярами, в которых вы создаете объекты вместо этого.

  • Обеспечьте сильную проверку типов в C (строгость строгости для typedefs)
  • Разница между 'struct' и 'typedef struct' в C ++?
  • Непрозрачные C-структуры: как их объявить?
  • Почему мы должны набирать структуру так часто в C?
  • C ++ шаблон typedef
  • Переслать-объявить перечисление в Objective-C
  • uint8_t против символа без знака
  • Это хорошая идея для указателей typedef?
  • Что такое «форвардная декларация» и разница между «typedef struct X» и «struct X»?
  • Как я могу ввести указатель на функцию с синтаксисом C ++ 11?
  • Как typedef работает для указателей функций
  • Давайте будем гением компьютера.