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

时间:2015-06-04 22:27:38

标签: 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 {}

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

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

来自ViewModelRefreshPostListFragment班级定义的

“链”
1)R extends RefreshPostViewModel<T> - &gt; R extends RefreshPostViewModel<R1 extends IRefreshPostViewCallback> - &gt; R extends AbstractViewModel<IRefreshPostViewCallback>
1.1)T extends IRefreshPostViewCallback
1.2)T(来自RefreshPostViewModel<T>)被<R1 extends IRefreshPostViewCallback>取代 1.1)和1.2)的结果,所以T参数应该没问题。

来自ViewModelHelper类定义的

“链”
2)R extends AbstractViewModel<T>
2.1)T extends IViewIRefreshPostViewCallback extends IView - &gt; T可以替换为IRefreshPostViewCallback

如果我在1.1)&amp;&amp;上申请2.1) 1.2)我们看到,参数T是一致的

从1开始跟随R extends AbstractViewModel<IRefreshPostViewCallback>跟随R extends AbstractViewModel<T>跟随T跟随IRefreshPostViewCallback跟随{{1}}可以替换为{{1}}, 如果我理解正确,则不应出现此错误, 有人可以解释一下,为什么日食会给我错误?

谢谢!

1 个答案:

答案 0 :(得分:4)

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

ViewModelHelper课程延伸AbstractViewModel<IRefreshPostViewCallback>,无论R1是什么。

在班级ViewModelHelper中,将extends AbstractViewModel子句中的类型参数更改为R1,而不是IRefreshPostViewCallback

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

这将消除错误。

这会在T中传递正确的ViewModelHelper。您将R使用RefreshPostViewModel<IRefreshPostViewCallback>,而不是RefreshPostViewModel<T>,而不是<div class="flex-align"> <img class="round" src="http://placehold.it/150x150" /> <img class="round" src="http://placehold.it/150x150" /> <img class="round" src="http://placehold.it/150x150" /> </div>