Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取泛型参数的泛型超类_Java_Reflection - Fatal编程技术网

Java 获取泛型参数的泛型超类

Java 获取泛型参数的泛型超类,java,reflection,Java,Reflection,但是如何获得ptype的泛型超类(这不仅意味着Super.class,还意味着类型参数Integer) 我的用例是,我想使用反射来确定方法的参数之一是否是MyClass对象的集合(我没有要检查的实际参数实例)类型参数在编译期间在java中被擦除。看或看。所以你可能无法做到这一点 据我所知,你不能这样做 您可以使用getActualTypeArguments(),提取子项(字符串和整数)的类型参数,但不能将它们与Super中的T相关联 您还可以从类Child extends Super中提取T,但

但是如何获得ptype的泛型超类(这不仅意味着
Super.class
,还意味着类型参数
Integer


我的用例是,我想使用反射来确定方法的参数之一是否是MyClass对象的集合(我没有要检查的实际参数实例)

类型参数在编译期间在java中被擦除。看或看。所以你可能无法做到这一点

据我所知,你不能这样做

您可以使用
getActualTypeArguments()
,提取
子项(
字符串
整数
)的类型参数,但不能将它们与
Super
中的
T
相关联

您还可以从
类Child extends Super
中提取
T
,但这不是您的情况


这意味着,如果您想在参数中查找
集合
,您只能在使用
方法(集合)
的情况下进行查找,而不能使用
方法(ArrayList)
或其他方法。

好吧,从上面的示例中可以进行查找。因为您可以提取方法参数(子级)的第二个类型参数(整数)的实际类型


返回
true

您能进一步澄清一下您的问题吗。如果List扩展了集合,并且一个参数是泛型类型List(即getRawType返回List.class和getActualTypeArguments返回[String.class]),那么JVM在概念上就知道该参数也是集合。这是反射信息的问题,而不是类型擦除(要知道List的第一个泛型参数也是Collection的第一个泛型参数)。但我想没有
class Super<T> {}

class Child<A, B> extends Super<B> {}

class Code {
  public void method(Child<String, Integer> child) {}
}
ParameterizedType ptype = (ParameterizedType) Code.class.getMethod("method").getGenericParameterTypes()[0]
Method method = Code.class.getMethod("method", Child.class);
ParameterizedType parameterType = (ParameterizedType) method.getGenericParameterTypes()[0];
Type secondType = parameterType.getActualTypeArguments()[1];
System.out.println(secondType == Integer.class);