假设您的包中声明了类型Pair<K,V>
。给定一个对象实例:
Pair<Integer, Integer> obj = new Pair<>(1,23);
我想检索分别与Integer
和Integer
相关联的类型参数K
和V
。顺便说一句,似乎是使用Java标准反射我无法使用Java中的实例访问实际的类。
TypeVariable<? extends Class<?>>[] parameters = obj.getClass().getTypeParameters();
我没有设法使用这些参数提取所需的信息。我开始怀疑,类型信息可能仅在编译时保留,而在运行时,实际的类型参数信息被删除。
答案 0 :(得分:1)
如果您只有一个实例,例如:Pair<Integer, Integer> pair = new Pair<>(1,23)
,则无法获取静态泛型类型,因为该信息在运行时会丢失。
另一方面,如果Pair<Integer, String>
是字段的类型,方法返回类型,方法参数的类型,或者如果泛型类型参数来自超类,则可以提取静态泛型类型。
检查my answer here以获取有关在这些情况下提取泛型类型的示例。
除此之外,您只能检查运行时值的动态类型,如Yahya所述。
答案 1 :(得分:0)
请考虑这个答案:
public static String[] getArgumentType(Object obj){
String[] type = new String[2];
type[0]=((Pair<?, ?>) obj).getKey().getClass().getName().replace("java.lang.", "");
type[1]=((Pair<?, ?>) obj).getValue().getClass().getName().replace("java.lang.", "");
return type;
}
public static void main(String[] args) {
Pair<String,Integer> obj = new Pair<String,Integer>("", 2);
String[] type = getArgumentType(obj);
System.out.println(type[0] + ", " + type[1]);
Pair<Integer,Integer> obj1 = new Pair<Integer,Integer>(1, 2);
type = getArgumentType(obj1);
System.out.println(type[0] + ", " + type[1]);
Pair<Double,Float> obj2 = new Pair<Double,Float>(1.1, 2.2f);
type = getArgumentType(obj2);
System.out.println(type[0] + ", " + type[1]);
Pair<Person,Object> obj3 = new Pair<Person,Object>(new Person(), new Object());
type = getArgumentType(obj3);
System.out.println(type[0] + ", " + type[1]);
}
输出:
String, Integer
Integer, Integer
Double, Float
Person, Object