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> {}