【发布时间】:2015-08-29 05:39:18
【问题描述】:
我收到编译器警告:
警告:[未选中] 作为原始类型 AbstractPresenter 的成员对 setView(V) 的未选中调用
this.presenter.setView(this);其中 V 是类型变量:
V 扩展了 AbstractPresenter 类中声明的 AbstractView
AbstractPresenter类的代码如下:
public abstract class AbstractPresenter<V extends AbstractView, M>
implements Presenter<V, M> {
private M model;
private V view;
@Override
public final V getView() {
return this.view;
}
public final void setView(V view) {
if (view == null) {
throw new NullPointerException("view cannot be null.");
}
if (this.view != null) {
throw new IllegalStateException("View has already been set.");
}
this.view = view;
}
@Override
public final M getModel() {
return this.model;
}
protected final void setModel(M model) {
if (model == null) {
throw new NullPointerException("model cannot be null.");
}
this.model = model;
}
}
setView 方法在下面的AbstractView 类中被调用:
public abstract class AbstractView<P extends AbstractPresenter> extends
UserControl {
private final P presenter;
public AbstractView(P presenter) {
this.presenter = presenter;
this.initialisePresenter();
}
private void initialisePresenter() {
if (this.presenter == null){
throw new IllegalStateException();
}
this.presenter.setView(this); //This is the call that raises the warning
}
protected P getPresenter() {
return this.presenter;
}
}
我搜索了其他成员关于相同警告的问题,并尝试根据我的问题调整解决方案,但没有奏效。
我不明白为什么在 V 类的声明中强制使用 V 类型时引发警告:
public abstract class AbstractPresenter<V extends AbstractView, M>
implements Presenter<V, M>
这只是一个警告,我可以忽略它,但我想了解它为什么会发生,我想让我的代码尽可能干净。
【问题讨论】:
-
代码中的循环引用让我很头疼。为什么view需要有presenter,为什么presenter又需要有view?您不能将其转换为单向关系吗?
-
@Chetan Kniger 和 Kervin 谢谢两位,现在我知道什么是原始类型,并且确实我有一个循环引用,如果我在 AbstractPresenter 类中参数化 V 的声明,它将转换为循环继承。 ..所以我需要回到设计部分。我认为 View 不需要在这里引用 Presenter。
标签: java generics compiler-warnings unchecked