2011-04-09 51 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

相關問題