Java 编译警告:未选中调用XXX作为原始类型的成员
我收到编译器警告: 警告:[未选中]未选中调用setView(V)作为原始类型AbstractPresenter的成员Java 编译警告:未选中调用XXX作为原始类型的成员,java,generics,compiler-warnings,unchecked,Java,Generics,Compiler Warnings,Unchecked,我收到编译器警告: 警告:[未选中]未选中调用setView(V)作为原始类型AbstractPresenter的成员 this.presenter.setView(this); 其中V是一个类型变量: V扩展了AbstractPresenter类中声明的AbstractView this.presenter.setView(this); AbstractPresenter类的代码如下: public abstract class AbstractPresenter<V e
this.presenter.setView(this);
其中V是一个类型变量:
V扩展了AbstractPresenter类中声明的AbstractView
this.presenter.setView(this);
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;
}
}
我搜索了其他成员提出的关于同一警告的问题,并试图根据我的问题调整解决方案,但没有奏效
我不明白为什么会在AbstractPresenter
类的声明中强制使用V
类型时发出警告:
public abstract class AbstractPresenter<V extends AbstractView, M>
implements Presenter<V, M>
公共抽象类AbstractPresenter
实现演示者
这只是一个警告,我可以忽略它,但我想了解为什么会发生这种情况,我想让我的代码尽可能干净。您的类型是原始的-也就是说,您的泛型类型绑定到一个本身有类型的类型,但您没有提供类型,所以它是原始的 将您的类型边界更改为键入。试试这个:
public abstract class AbstractPresenter<V extends AbstractView<V>, M> implements Presenter<V, M>
公共抽象类AbstractPresenter实现了Presenter
及
公共抽象类AbstractView您的问题在于这一行:
public abstract class AbstractView<P extends AbstractPresenter> extends
V
是一种扩展原始抽象视图的类型,我们不知道它的基本类型是什么。因此,编译器无法完成泛型的工作
无论何时进行此类类型声明,请记住在声明中指定所有泛型类型的类型,并使用正确表示它们之间关系的类型变量。我本来想添加注释,但由于信誉不足,无法添加注释
你的类型是原始的。AbstractView中的presenter是原始类型,因为传递给AbstractView的泛型参数是原始的代码中的循环引用让我头疼。为什么视图需要一个演示者,而演示者又需要一个视图?你不能将其转换为单向关系吗?@Chetan Kniger和Kervin谢谢你们,现在我知道了什么是原始类型,事实上我有一个循环引用,如果我在AbstractPresenter类中参数化V的声明,它将转换为循环继承。。。所以我需要回到设计部分。我认为该视图不需要引用此处的演示者。我无法检查多个答案,因此我检查了其中一个,但所有贡献都帮助我解决了问题,因此感谢此线程中的所有人。
public abstract class AbstractView<P extends AbstractPresenter> extends
public abstract class AbstractPresenter<V extends AbstractView, M>