如何在 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&lt;String, String&gt; 不同的类

【讨论】:

@Lee - KARASZI István 关于类型的警告很重要 - 请参阅 ibm.com/developerworks/java/library/j-jtp02216/index.html 您可以使用泛型做另一种技巧/黑客:***.com/questions/5604390/… 但是因为这是一个更通用类型的特化,你不能使用 TheNewType 代替 HashMap&lt;String, String&gt; 就像你不能使用后者一样 Map&lt;String, String&gt; 是返回。【参考方案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 这与其他答案中的想法相同,因为您使用派生的概念来获取新的类型名称。这里是来自IntegerI 和来自LongL,通过约束类型变量,其他答案通过构造一个新类从HashMap&lt;String,String&gt; 提出NewType。类型变量方法的缺点是您只能在类型变量的范围内使用它,例如Test 类或 x 方法。【参考方案4】:

能想到的最接近的方法是像这样制作一个包装类

class NewType extends HashMap<String, String> 
     public NewType()  

我真希望 Java 有一个健全的类型别名功能。

【讨论】:

【参考方案5】:

Java 中没有类似的东西。您也许可以使用 IDE 模板或自动完成功能做一些事情,并期待 Java 7 中的(有限)generics type inference。

【讨论】:

以上是关于如何在 Java 中创建一些变量类型别名的主要内容,如果未能解决你的问题,请参考以下文章

如何在类型变量中创建任何类型的字典? [复制]

用Java创建JMeter变量 - 终极指南

我可以在 Golang 中创建一个类型的别名吗?

如何在 C# 中创建包含不同类型的字典类型?

如何在目标 c 中创建 BOOL 实例变量?

如何在 Java 中创建静态局部变量?