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

这主要是一个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 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团队会考虑你发布的内容。