如何在 Java 中创建一些变量类型别名
Posted
技术标签:
【中文标题】如何在 Java 中创建一些变量类型别名【英文标题】:How do I create some variable type alias in Java 【发布时间】:2011-08-02 00:59:57 【问题描述】:假设我有这个代码
Map<String, String> list = new HashMap<String, String>();
list.put("number1", "one");
list.put("number2", "two");
我怎样才能为类型添加一些“别名”
Map<String, String>
改成更容易改写的东西,比如
// may be something like this
theNewType = HashMap<String, String>;
theNewType list = new theNewType();
list.put("number1", "one");
list.put("number2", "two");
基本上我的问题是,如何为某些“类型”创建“别名”,以便在需要更改整个程序代码时更容易编写和更容易。
谢谢,如果这是个愚蠢的问题,我很抱歉。我是 Java 新手。
【问题讨论】:
【参考方案1】:Java 中没有别名。您可以使用您的类扩展 HashMap
类,如下所示:
public class TheNewType extends HashMap<String, String>
// default constructor
public TheNewType()
super();
// you need to implement the other constructors if you need
但请记住,这将是一个与您键入 HashMap<String, String>
不同的类
【讨论】:
@Lee - KARASZI István 关于类型的警告很重要 - 请参阅 ibm.com/developerworks/java/library/j-jtp02216/index.html 您可以使用泛型做另一种技巧/黑客:***.com/questions/5604390/… 但是因为这是一个更通用类型的特化,你不能使用TheNewType
代替 HashMap<String, String>
就像你不能使用后者一样 Map<String, String>
是返回。【参考方案2】:
Java 中没有typedef
等价物,也没有别名类型的通用习惯用法。我想你可以做类似的事情
class StringMap extends HashMap<String, String>
但这并不常见,对程序维护者来说并不明显。
【讨论】:
请记住,如果您这样做,您应该为您的子类实现 Serializable 接口的缺失细节。否则,如果您遇到需要(反)序列化对象的情况,您可能会遇到好奇心。【参考方案3】:虽然 Java 不支持这一点,但您可以使用泛型技巧来模拟它。
class Test<I extends Integer>
<L extends Long> void x(I i, L l)
System.out.println(
i.intValue() + ", " +
l.longValue()
);
来源:http://blog.jooq.org/2014/11/03/10-things-you-didnt-know-about-java/
【讨论】:
我不知道你到底为什么讨厌 OP 并希望他被同事打死 IMO 这与其他答案中的想法相同,因为您使用派生的概念来获取新的类型名称。这里是来自Integer
的I
和来自Long
的L
,通过约束类型变量,其他答案通过构造一个新类从HashMap<String,String>
提出NewType
。类型变量方法的缺点是您只能在类型变量的范围内使用它,例如Test
类或 x
方法。【参考方案4】:
能想到的最接近的方法是像这样制作一个包装类
class NewType extends HashMap<String, String>
public NewType()
我真希望 Java 有一个健全的类型别名功能。
【讨论】:
【参考方案5】:Java 中没有类似的东西。您也许可以使用 IDE 模板或自动完成功能做一些事情,并期待 Java 7 中的(有限)generics type inference。
【讨论】:
以上是关于如何在 Java 中创建一些变量类型别名的主要内容,如果未能解决你的问题,请参考以下文章