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

在Java中,如何为Map构造一个Type对象?

 System.out.println(Map.class); 

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

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

这是正确的方法吗?

 public class Test { public Map 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等等,因此根据您的需要,第一种方法可能仍然会更好。)

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

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

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