Java 泛型与奥姆利特
这主要是一个Java泛型问题,但我如何才能做到这一点:Java 泛型与奥姆利特,java,generics,ormlite,Java,Generics,Ormlite,这主要是一个Java泛型问题,但我如何才能做到这一点: class BaseClass { public void save() { OrmLiteInstance.getDao(getClass()).createOrUpdate(this) } class B extends BaseClass class A extends BaseClass 这将导致以下错误: Error:(61, 58) error: method createOrUpdate i
class BaseClass {
public void save() {
OrmLiteInstance.getDao(getClass()).createOrUpdate(this)
}
class B extends BaseClass
class A extends BaseClass
这将导致以下错误:
Error:(61, 58) error: method createOrUpdate in interface Dao<T,ID> cannot be applied
to given types;
required: CAP#1
found: BaseClass
reason: actual argument BaseClass cannot be converted to CAP#1 by method invocation conversion
where T,ID are type-variables:
T extends Object declared in interface Dao
ID extends Object declared in interface Dao
where CAP#1 is a fresh type-variable:
CAP#1 extends BaseClass from capture of ? extends BaseClass
错误:(61,58)错误:无法应用接口Dao中的方法createOrUpdate
对给定的类型;
必填项:第1章
发现:基类
原因:无法通过方法调用转换将实际参数基类转换为CAP#1
其中T,ID是类型变量:
T扩展接口Dao中声明的对象
ID扩展接口Dao中声明的对象
其中CAP#1是一个新类型变量:
CAP#1扩展了从捕获到的基类?扩展基类
方法的签名为:
public <D extends Dao<T, ?>, T> D getDao(Class<T> clazz) throws SQLException
public CreateOrUpdateStatus createOrUpdate(T data) throws SQLException;
public D getDao(类clazz)抛出SQLException
公共CreateOrUpdateStatus createOrUpdate(T数据)抛出SQLException;
发生此错误是因为方法getClass()
在被类型T
调用时返回Class
,这意味着createOrUpdate
方法需要类型为的参数?扩展T
在代码示例中,对getDao(getClass())
的调用返回类型D扩展Dao
,因此对createOrUpdate
的调用需要类型为的对象?扩展基类
。但是此
引用的对象类型为基类
。因此,错误消息告诉您,BaseClass
与的类型不同?扩展基类
(由于缺少正式标签,它神秘地命名为CAP#1
)
要解决此问题,请尝试将getDao
方法的签名更改为以下内容:
public <D extends Dao<T, ?>, T> D getDao(Class<? extends T> clazz);
<代码>公共D GETDAO(分类用一个建议的方法签名更新了答案。它用这个签名为我编译好了,但是我没有完全相同的基础设施,只是一个存根结构。我颠倒了我做事情的方式,所以不再需要。也许OrMLITE团队会考虑你发布的内容。