Java 编译警告:未选中调用XXX作为原始类型的成员

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

我收到编译器警告:

警告:[未选中]未选中调用setView(V)作为原始类型AbstractPresenter的成员

   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>