我遇到以下问题:
我有这些课程&界面定义
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参数应该没问题。
“链”
2)R extends AbstractViewModel<T>
2.1)T extends IView
,IRefreshPostViewCallback 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}},
如果我理解正确,则不应出现此错误,
有人可以解释一下,为什么日食会给我错误?
谢谢!
答案 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>
。