创建与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定义仅由编译器使用以确保类型安全。