在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对象的实例。