在C ++中是否有类似于Java的typedef关键字或方法?

来自C和C ++的背景,我发现明智地使用typedef是非常有用的。 您是否知道在Java中实现类似function的方法,无论是Java机制,模式还是其他有效的方法?

Java有原始types,对象和数组,就是这样。 没有typedefs。

如果这是你的意思,你可以简单地扩展你想要typedef的类,例如:

 public class MyMap extends HashMap<String, String> {} 

在1.6中没有java中的typedef,你可以做的是做一个你想要的包装类,因为你不能inheritance最后的类(整型,双等)

实际上,唯一使用typedef的东西就是混淆,就是给同一个类别多个名字。 也就是说,你有一个类“A”,你想要“B”引用相同的东西。 在C ++中,你会做“typedef BA”

不幸的是,他们不支持它。 但是,如果你控制了所有的types,你可以在图书馆层面进行讨厌的破解 – 你可以从A扩展B或者B实现A.

正如其他人之前提到的,
Java中没有typedef机制。
一般来说,我也不支持“假class”,但是这里不应该有一般的严格的经验法则:
例如,如果你的代码使用了一遍又一遍的“genericstypes”,例如:

 Map<String, List<Integer>> 

您绝对应该考虑为此目的设立一个子类。
人们可以考虑的另一种方法是例如在你的代码中使用如下的减速:

 //@Alias Map<String, List<Integer>> NameToNumbers; 

然后在你的代码中使用NameToNumbers并且有一个预编译器任务(ANT / Gradle / Maven)来处理和生成相关的java代码。
我知道,对于这个答案的读者来说,这听起来有些奇怪,但是这是多less个框架在JDK 5之前实现了“注解”,这是lombok正在做的项目和其他框架。

也许这可能是另一个可能的替代:

 @Data public class MyMap { @Delegate //lombok private HashMap<String, String> value; } 

正如在其他答案中指出的,你应该避免伪typedef反模式 。 但是,typedef仍然有用,即使这不是实现它们的方法。 您想要区分具有相同Java表示forms的不同抽象types。 你不想混合那些是街道地址的密码string,或者是代表偏移量的整数和那些代表绝对值的整数。

Checker框架使您能够以向后兼容的方式定义typedef。 我甚至为原始类,如int和最终类,如String 。 它没有运行时间的开销,不会中断平等testing。

Checker Framework手册中的Section 别名和typedefs描述了根据您的需要创buildtypedefs的几种方法。

在某些情况下,绑定注释可能正是您正在寻找的内容:

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

或者如果你不想依靠Guice,只需要定期的注释就可以了。

Typedef允许将项目隐式分配给它们不是的types。 有些人试图用扩展来解决这个问题。 在IBM阅读这里解释为什么这是一个坏主意。

编辑:虽然强types推断是一个有用的东西,我不认为(也不希望我们不会)看到typedef饲养这是pipe理的语言(永远?)丑陋的头。

编辑2:在C#中,可以在源文件的顶部使用这样的使用语句。 它被使用,所以你不必做第二项显示。 只有当范围引入两种types之间的名称冲突时,才会看到名称更改。 重命名仅限于一个文件,其外部的每个variables/参数types都以其全名而知晓。

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

你可以使用一个枚举,虽然这在语义上有点不同于一个typedef,因为它只允许有限的一组值。 另一个可能的解决scheme是一个命名包装类,例如

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

但似乎更笨重,特别是从代码中不清楚,类没有其他function而不是别名。

Java中不需要typedef。 除了基元之外,一切都是一个对象。 没有指针,只有引用。 通常情况下使用typedef的场景是您创build对象的实例。