Java:代码的泛型类解释 来自C++,一些java代码对我来说很奇怪。有人能给我解释一下下面的代码片段应该做什么吗 @SuppressWarnings("unchecked") private static <T> Class<T> getGenericType(Class<?> clz) { return (Class<T>) ((ParameterizedType) clz.getGenericSuperclass()) .getActualTypeArguments()[0]; } @SuppressWarnings(“未选中”) 私有静态类getGenericType(类clz){ 返回(类)((ParameterizedType)clz.getGenericSuperclass() .getActualTypeArguments()[0]; }
我是在回答另一个问题()时读到这篇文章的,我正试图详细理解这个问题。这个方法在我的系统上做什么,现在我测试它,就是在运行时抛出一个异常。所以我猜它的作用是“没什么用处”Java:代码的泛型类解释 来自C++,一些java代码对我来说很奇怪。有人能给我解释一下下面的代码片段应该做什么吗 @SuppressWarnings("unchecked") private static <T> Class<T> getGenericType(Class<?> clz) { return (Class<T>) ((ParameterizedType) clz.getGenericSuperclass()) .getActualTypeArguments()[0]; } @SuppressWarnings(“未选中”) 私有静态类getGenericType(类clz){ 返回(类)((ParameterizedType)clz.getGenericSuperclass() .getActualTypeArguments()[0]; },java,generics,syntax,Java,Generics,Syntax,我是在回答另一个问题()时读到这篇文章的,我正试图详细理解这个问题。这个方法在我的系统上做什么,现在我测试它,就是在运行时抛出一个异常。所以我猜它的作用是“没什么用处” 公共类泛型测试 { 公共静态void main(字符串[]args) { ArrayList al=新的ArrayList(); System.out.println(getGenericType(al.getClass()); } @抑制警告(“未选中”) 私有静态类getGenericType(类clz) { 返回(类)((
公共类泛型测试
{
公共静态void main(字符串[]args)
{
ArrayList al=新的ArrayList();
System.out.println(getGenericType(al.getClass());
}
@抑制警告(“未选中”)
私有静态类getGenericType(类clz)
{
返回(类)((ParameterizedType)clz.getGenericSuperclass()
.getActualTypeArguments()[0];//第28行
}
}
运行:
线程“main”java.lang.ClassCastException中的异常:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法强制转换为java.lang.Class
在quicktest.GenericTest.getGenericType(GenericTest.java:28)
位于quicktest.GenericTest.main(GenericTest.java:21)
C:\Users\Brenden\AppData\Local\NetBeans\Cache\8.1\executor snippets\run.xml:53:Java返回:1
生成失败(总时间:2秒)
假设您有一个泛型类Foo
,如下所示:
public class Foo<T> {
T myVar;
}
Bar
不是泛型类,尽管它使用泛型类作为其超类。它指定,对于Bar
的所有实例,类型变量T
实际上是String
,因此它从Foo
继承的myVar
实例变量将始终是String
现在有了这个设置,让我们来看看你的方法
首先,它将类
对象作为其参数。假设我们用Bar.class
来称呼它。您的方法所做的第一件事是对其调用getGenericSuperclass()
,它检索表示其超类的对象-Foo
现在,getGenericSuperclass()
被声明为返回一个类型
对象,但该代码假设传入的类具有泛型继承(即,它扩展了类似Foo
的内容,而不仅仅是Foo
),在这种情况下,它将实际返回一个参数化类型
。因此,它类型转换它并调用getActualTypeArguments()
来检索类型参数是什么-字符串的部分扩展了Foo
。这是作为数组返回的,因为在更一般的情况下,它可能会处理扩展ComplexObject
之类的事情
获取了Class
对象的大小为1的数组后,它将返回数组的第一个成员。在本例中,返回值是String.class
它返回泛型的类型,因此如果您传递ArrayList
,它将返回String
,老实说,我认为它只是用于@SuppressWarnings
的。除了调用getActualTypeArguments()
,此代码实际上什么都不做。泛型基本上都从实际运行时代码中删除。“另一个问题”哪个问题?@Lashane您不能将此方法传递给ArrayList;它的参数类型是Class
,您可以传入ArrayList.Class
。@markspace没有ArrayList.Class
,只有ArrayList.Class
。这是因为您正在传递它ArrayList.Class
(以稍微迂回的方式检索),它在继承中不使用泛型。我应该传递什么类类型?任何扩展
子句包含泛型尖括号的类。ArrayList
的一个匿名子类,如@Lashane`指出,应该可以工作(注意{}
)。
public class Foo<T> {
T myVar;
}
public class Bar extends Foo<String> {}