Java泛型:绑定不匹配:该类型不是该类型的有界参数的有效替代

Fil*_*ipR 6 java eclipse generics

我面临以下问题:

我有这些类和接口定义

public abstract class ViewModelRefreshPostListFragment<T extends IRefreshPostViewCallback, R extends RefreshPostViewModel<T>>
    extends RefreshPostListFragment implements IRefreshPostView {

    private final ViewModelHelper<T, R> mViewModeHelper = //error here
        new ViewModelHelper<>(); 

...
}

public abstract class RefreshPostViewModel<R1 extends IRefreshPostViewCallback> extends AbstractViewModel<IRefreshPostViewCallback> {}

public class ViewModelHelper<T extends IView, R extends AbstractViewModel<T>> {}

public abstract class AbstractViewModel<T extends IView> {}

public interface IRefreshPostViewCallback extends IView {}
Run Code Online (Sandbox Code Playgroud)

Eclipse仍然给出了这个错误:绑定不匹配:类型R不是该类型的有界参数<R extends AbstractViewModel<T>>的有效替代ViewModelHelper<T,R>

基于Java继承,我创建了这两个链:

来自ViewModelRefreshPostListFragment类定义的"链"
1)R extends RefreshPostViewModel<T>- > R extends RefreshPostViewModel<R1 extends IRefreshPostViewCallback>- > R extends AbstractViewModel<IRefreshPostViewCallback>
1.1)T extends IRefreshPostViewCallback
1.2)T(from RefreshPostViewModel<T>)被<R1 extends IRefreshPostViewCallback> 来自1.1)和1.2)的Consitent结果所取代,因此T参数应该是OK.

来自ViewModelHelper类定义的"链"
2)R extends AbstractViewModel<T>
2.1)T extends IView,IRefreshPostViewCallback extends IView- > T可以替换为IRefreshPostViewCallback

如果我在1.1)&& 1.2)上应用2.1),我们看到,参数T是一致的

从1)跟随R extends AbstractViewModel<IRefreshPostViewCallback>从2)跟随 R extends AbstractViewModel<T> 和2.1)跟随T可以替换IRefreshPostViewCallback,如果我理解正确,这个错误不应该出现,有人可以解释我,为什么eclipse给我错误?

谢谢!

rge*_*man 4

R错误消息来自于不在其范围内的事实。

你的ViewModelHelper班级会延长AbstractViewModel<IRefreshPostViewCallback>,无论R1实际情况如何。

在类中,更改to子句ViewModelHelper中的类型参数,而不是。extendsAbstractViewModelR1IRefreshPostViewCallback

public abstract class RefreshPostViewModel<R1 extends IRefreshPostViewCallback>
    extends AbstractViewModel<R1>
Run Code Online (Sandbox Code Playgroud)

这将消除错误。

这将T在 中传递正确的内容ViewModelHelper。你将不再是R“存在” ,而是“使用” ,从而实现界限。RefreshPostViewModel<IRefreshPostViewCallback>RefreshPostViewModel<T>