Java 从泛型获取类不起作用

Java 从泛型获取类不起作用,java,generics,Java,Generics,我现在真的很困惑。我正在另一个项目中使用以下代码,没有任何问题: public class ReadOnlyTable<T extends Model> implements ReadOnly<T> { protected at.viswars.database.framework.core.DatabaseTable datasource; private boolean debug = true; protected ReadOnlyTable() { in

我现在真的很困惑。我正在另一个项目中使用以下代码,没有任何问题:

public class ReadOnlyTable<T extends Model> implements ReadOnly<T> {
protected at.viswars.database.framework.core.DatabaseTable datasource;
private boolean debug = true;

protected ReadOnlyTable() {
    initTable();
}

protected void reloadDataSource() {
    initTable();
}

private void initTable() {
    boolean readOnlyClass = false;
    if (getClass().getSuperclass().equals(ReadOnlyTable.class)) readOnlyClass = true;

    Class<T> dataClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
public类ReadOnlyTable实现ReadOnly{
受保护的at.viswars.database.framework.core.DatabaseTable数据源;
私有布尔调试=true;
受保护的只读表(){
initTable();
}
受保护的void重载数据源(){
initTable();
}
私有void initTable(){
布尔readOnlyClass=false;
如果(getClass().getSuperclass().equals(ReadOnlyTable.class))readOnlyClass=true;
类dataClass=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
最后一行将毫无问题地运行。现在我做了第二个项目,因为我在阅读课程时遇到了问题,所以我尝试做了最简单的案例:

public class GenericObject<T> implements IGenericObject<T> {
public GenericObject() {
    init();
}

private void init() {
    Class<T> clazz = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
公共类GenericObject实现IGenericObject{
公共GenericObject(){
init();
}
私有void init(){
类clazz=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}

此类在此处实例化:

        GenericObject<String> go = new GenericObject<String>();
generiobject go=new generiobject();
在第二个示例中,我将始终收到以下错误消息:

线程“main”java.lang.ClassCastException中出现异常:无法将java.lang.Class转换为java.lang.reflect.ParameterizedType


我缺少的是什么?这让我抓狂。非常感谢您的帮助!

您正在调用
getGenericSuperclass()
,但您的类没有泛型超类。它的超类是
Object
,正如错误所说,它不能转换为
ParameterizedType

您可能想使用
getGenericInterfaces()[0]
,因为您的类只实现了一个接口


此处的详细信息:

您正在调用
getGenericSuperclass()
,但您的类没有泛型超类。其超类是
对象
,如错误所示,它不能转换为
参数化类型

您可能想使用
getGenericInterfaces()[0]
,因为您的类只实现了一个接口


此处的详细信息:

无法从
go
检索
字符串
。对象实例化表达式(
new generiobject()
)的类型参数在运行时的任何位置都不存在。这是类型擦除


当一个类或接口使用特定的类型参数扩展或实现另一个类或接口时,您尝试使用的技术会引起关注。例如,
class Something扩展了GenericObject
。这样就可以从类对象获取此声明信息。这与您所做的完全无关。

I无法从
go
中检索
String
。对象实例化表达式(
new GenericObject()
)的类型参数在运行时的任何位置都不存在。这是类型擦除


当一个类或接口使用特定类型参数扩展或实现另一个类或接口时,您尝试使用的技术会引起关注。例如,
class Something扩展了GenericObject
。这样就可以从类对象获取此声明信息。这与您所做的完全无关。

正确指出错误,但
getGenericInterfaces
也不会有帮助。
getClass()
不一定返回
GenericObject.class
,因为
GenericObject
不是
最终的
。即使返回,
getGenericInterfaces()[0]
将返回一个
类型
表示
IGenericObject
,其中
T
未解析。好的,根据我上面收到的错误消息,您是对的,没有注意到它谈到了参数化类型。无论如何,与我的第一个列表有什么大的区别,ReadOnlyTable是层次结构中最顶层的类,所以应该有相同的类问题。它尝试了以下行:Class clazz=(Class)((ParameterizedType)getClass().GetGenericInterface()[0])。getActualTypeArguments()[0];给了我错误:java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法转换为java.lang.Class抱歉,我对这些内容不太熟悉,将尝试检查您的链接相关:非常感谢您提供了此链接Paul Bellora,我在第一个列表中运行了它,并且有一个已解析的类型,因此我认为我是c找出确切的差异。当我发现错误时,我将更新此问题。您正确指出了错误,但
getGenericInterfaces
也没有帮助。
getClass()
不一定返回
generiobject.class
,因为
generiobject
不是
final
。即使返回,
GetGenericInterface()[0]
将返回一个
类型
表示
IGenericObject
,其中
T
未解析。好的,根据我上面收到的错误消息,您是对的,没有注意到它谈到了参数化类型。无论如何,与我的第一个列表有什么大的区别,ReadOnlyTable是层次结构中最顶层的类,所以应该有相同的类问题。它尝试了以下行:Class clazz=(Class)((ParameterizedType)getClass().GetGenericInterface()[0])。getActualTypeArguments()[0];给了我错误:java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法转换为java.lang.Class抱歉,我对这些内容不太熟悉,将尝试检查您的链接相关:非常感谢您提供了此链接Paul Bellora,我在第一个列表中运行了它,并且有一个已解析的类型,因此我认为我是c找出确切的差异。当我发现错误时,我将更新此问题。