创建与泛型类型对应的Type对象

Ale*_*nov 5 java generics

在Java中,我如何构造一个Type对象Map<String, String>

System.out.println(Map<String, String>.class);
Run Code Online (Sandbox Code Playgroud)

不编译.我能想到的一个解决方法是

Map<String, String> dummy() { throw new Error(); }
Type mapStringString = Class.forName("ThisClass").getMethod("dummy", null).getGenericReturnType();
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

aio*_*obe 5

public class Test {
    public Map<String, String> dummy;
    public static void main(String... args) throws SecurityException, 
                                                   NoSuchFieldException {
        Type mapStringString = Test.class.getField("dummy").getGenericType();
        // ...
Run Code Online (Sandbox Code Playgroud)

是一个稍微不那么丑陋的黑客..


正如Tom Hawtin建议的那样,您可以自己实现这些方法:

Type mapStrStr2 = new ParameterizedType() {
    public Type getRawType() {
        return Map.class;
    }
    public Type getOwnerType() {
        return null;
    }
    public Type[] getActualTypeArguments() {
        return new Type[] { String.class, String.class };
    }
};
Run Code Online (Sandbox Code Playgroud)

返回与声明的方法的其他方法相同的值ParameterizedType.第一种方法的结果甚至是.equals这种类型.(但是,这种方法不会覆盖toString,equals等等,因此根据您的需要,第一种方法可能仍会更好.)