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找出确切的差异。当我发现错误时,我将更新此问题。