在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();
这是正确的方法吗?
答案 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)
是的,这是在运行时获取泛型的唯一方法。类型被擦除(“类型擦除”),字节码映射实际上是对象到对象映射,源代码中的泛型定义仅由编译器使用以确保类型安全。