2011-04-09 78 views
31

让说我有这样的代码如何在Java中创建一些变量类型别名

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"); 

基本上我的问题是,如何创建一个“类型”的“别名”,所以我可以使它更容易编写和更容易wh需要更改整个程序代码。

谢谢,对不起,如果这是愚蠢的问题。我在Java中有点新鲜。

回答

37

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>

+3

@Lee - KARASZI伊什特万的关于类型的警告是非常重要的 - 见http://www.ibm.com/developerworks/java/library/j-jtp02216/index.html – McDowell 2011-04-09 11:36:29

+0

谢谢您。我现在使用这个。这有很大帮助。 – Lee 2011-04-10 04:05:23

+1

还有一种替代技巧/黑客可以用泛型来做:http://stackoverflow.com/questions/5604390/how-do-i-create-some-variable-type-alias-in-java/27536347#27536347 – 2014-12-17 22:54:28

0

在Java中没有这样的东西。您可能可以使用IDE模板或自动完成功能进行操作,并期待在Java 7中使用generics type inference(有限)。

8

有相当于在没有typedef Java,并没有别名类型的常见成语。我想你可以做类似

class StringMap extends HashMap<String, String> {} 

但这并不常见,对于程序维护人员来说并不明显。

+3

+1 - 它是一个新类型,不是类型别名。 – 2011-04-09 10:19:58

+0

请记住,如果你这样做,你应该为你的子类实现Serializable接口的缺失细节。否则,如果您遇到需要(去)序列化对象的情况,您可能会遇到好奇心。 – nasukkin 2016-08-30 22:43:35

0

最近一个能想到的是做一个包装类,像这样

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

我真的希望有Java的声音类别失真功能。

+0

感谢您的帮助。它确实有很大的帮助。 – Lee 2011-04-10 04:06:20

7

尽管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/

+2

我不确定为什么你讨厌OP,并希望他被同事们打死 – shabunc 2017-06-13 13:50:49