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

时间:2010-06-07 11:34:17

标签: java generics

在Java中,如何为Type构建Map<String, String>对象?

System.out.println(Map<String, String>.class);

无法编译。我能想到的一个解决方法是

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

这是正确的方法吗?

3 个答案:

答案 0 :(得分: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();
        // ...

稍微不那么难看的黑客..


正如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 };
    }
};

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

答案 1 :(得分:2)

这些都是通过接口完成的,因此您可以构建自己的实现。

但是,最简单的方法是对为此目的创建的虚拟类使用反射。

答案 2 :(得分:0)

是的,这是在运行时获取泛型的唯一方法。类型被擦除(“类型擦除”),字节码映射实际上是对象到对象映射,源代码中的泛型定义仅由编译器使用以确保类型安全。