由于有C和c++的背景,我发现明智地使用typedef非常有帮助。您是否知道在Java中实现类似功能的方法,无论是Java机制、模式,还是您使用过的其他有效方法?
当前回答
Typedef允许将项隐式分配给它们不是的类型。有些人试图通过扩展来解决这个问题;请阅读IBM关于为什么这是一个坏主意的解释。
编辑:虽然强类型推断是一个有用的东西,但我不认为(希望我们不会)看到typedef在托管语言中出现它丑陋的头(永远不会?)
编辑2:在c#中,你可以在源文件的顶部使用这样的using语句。这样你就不用做第二项了。只有在作用域引入两个类型之间的名称冲突时才会看到名称更改。重命名仅限于一个文件,除此之外,使用它的每个变量/参数类型都知道其全名。
using Path = System.IO.Path;
using System.IO;
其他回答
Typedef允许将项隐式分配给它们不是的类型。有些人试图通过扩展来解决这个问题;请阅读IBM关于为什么这是一个坏主意的解释。
编辑:虽然强类型推断是一个有用的东西,但我不认为(希望我们不会)看到typedef在托管语言中出现它丑陋的头(永远不会?)
编辑2:在c#中,你可以在源文件的顶部使用这样的using语句。这样你就不用做第二项了。只有在作用域引入两个类型之间的名称冲突时才会看到名称更改。重命名仅限于一个文件,除此之外,使用它的每个变量/参数类型都知道其全名。
using Path = System.IO.Path;
using System.IO;
如果这是你的意思,你可以简单地扩展你想要typedef的类,例如:
public class MyMap extends HashMap<String, String> {}
在java 1.6中没有类型定义,你能做的是为你想要的做一个包装类,因为你不能子类化最终类(Integer, Double等)
也许这是另一种可能的替代:
@Data
public class MyMap {
@Delegate //lombok
private HashMap<String, String> value;
}
您可以使用Enum,尽管它在语义上与typedef略有不同,因为它只允许一组受限制的值。另一个可能的解决方案是命名包装器类,例如。
public class Apple {
public Apple(Integer i){this.i=i; }
}
但这似乎更笨拙,特别是考虑到从代码中无法清楚地看出类除了作为别名之外没有其他函数。
推荐文章
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 未定义对静态constexpr char的引用[]
- 对于一个布尔字段,它的getter/setter的命名约定是什么?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件
- 在c++中,restrict关键字是什么意思?
- 如何创建可变参数宏(参数数量可变)
- 如何计算一个元素在列表中出现的次数
- c++中类似于java的instanceof
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 如何POST表单数据与Spring RestTemplate?
- include_directories和target_include_directories在CMake中的区别是什么?
- Mockito中检测到未完成的存根
- 我应该如何复制字符串在Java?
- std::make_pair与std::pair的构造函数的目的是什么?