How do I create some variable type alias in Java

2019-01-14 14:49发布

问题:

let say I have this code

Map<String, String> list = new HashMap<String, String>();
list.put("number1", "one");
list.put("number2", "two");

how can I make some "alias" the type

Map<String, String>

to something that easier to be rewritten like

// may be something like this
theNewType = HashMap<String, String>;

theNewType list = new theNewType();
list.put("number1", "one");
list.put("number2", "two");

basically my question is, how to create "alias" to some "type", so i can make it easier to write and easier when need to change the whole program code.

Thanks, and sorry if this is silly question. I'm kinda new in Java.

回答1:

There are no aliases in Java. You can extend the HashMap class with your class like this:

public class TheNewType extends HashMap<String, String> {
    // default constructor
    public TheNewType() {
        super();
    }
    // you need to implement the other constructors if you need
}

But keep in mind that this will be a class it won't be the same as you type HashMap<String, String>



回答2:

There is no typedef equivalent in Java, and there is no common idiom for aliasing types. I suppose you could do something like

class StringMap extends HashMap<String, String> {}

but this is not common and would not be obvious to a program maintainer.



回答3:

Although Java doesn't support this, you can use a generics trick to simulate it.

class Test<I extends Integer> {
    <L extends Long> void x(I i, L l) {
        System.out.println(
            i.intValue() + ", " + 
            l.longValue()
        );
    }
}

Source: http://blog.jooq.org/2014/11/03/10-things-you-didnt-know-about-java/



回答4:

The closest one could think of is to make a wrapper class like so

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

I really wish Java had a sound type aliasing feature.



回答5:

Nothing like that exists in Java. You might be able to do something with IDE templates or autocompletion, and look forward to (limited) generics type inference in Java 7.