如何修复 "unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter'"?

How to fix "unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter'"?

我已经在这里查找了很多关于这个问题的答案,但就我个人而言,我似乎无法解决这个问题,我需要一些帮助。

BasePresenter:

public abstract class BasePresenter<V> {

    private V mView;

    public void attachView(V view) { mView = view; }
    public void detachView() { mView = null; }

}

基础片段:

public abstract class BaseFragment<P extends BasePresenter> extends Fragment {

    @Inject protected P mPresenter;

    @Override
    public void onResume() {
        super.onResume();
        mPresenter.attachView(this); // unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter'
    }

    @Override
    public void onPause() {
        super.onPause();
        mPresenter.detachView();
    }

}

我的演示者:

public class MyPresenter extends BasePresenter<MyPresenter.MyView> {

    @Inject
    public MyPresenter() {}

    public interface MyView {}

}

我的片段:

public class MyFragment extends BaseFragment implements MyPresenter.MyView {}

问题出在类型变量声明中:

class BaseFragment<P extends BasePresenter>

BasePresenter 是一个泛型class,所以你需要指定它的类型参数是什么。来自这个片段:

mPresenter.attachView(this);

您似乎希望 BaseFragment 绑定到 BasePresenter 中的类型变量 V - 所以我将按如下方式重写您的 BaseFragment 声明:

abstract class BaseFragment<P extends BasePresenter<BaseFragment<P>>> { ... }

那应该处理未经检查的警告。也就是说,我强烈怀疑你真正想要的是这样的:

abstract class BaseFragment<P extends BasePresenter<V>, V> { ... }

其中 V 是一个独立的类型变量,建模 'view'。

简单,而不是

public abstract class BaseFragment<P extends BasePresenter> extends Fragment {

应该是

public abstract class BaseFragment<V, P extends BasePresenter<V>> extends Fragment { 

public abstract class BaseFragment<P extends BasePresenter<BaseFragment<P>>> extends Fragment { 

public abstract class BaseFragment<V extends BaseFragment<V, P>, P extends BasePresenter<V>> extends Fragment { 

基本上,确保 BasePresenter 参数化了一些东西。




编辑:

好的,根据您实际尝试做的事情,您应该这样做:

public abstract class BasePresenter<V> {

    private V mView;

    public void attachView(V view) { mView = view; }
    public void detachView() { mView = null; }
}

public abstract class BaseFragment<V extends BaseFragment<V, P>, P extends BasePresenter<V>> extends Fragment {

    protected abstract P getPresenter();

    @Override
    public void onResume() {
        super.onResume();
        getPresenter().attachView(this); // unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter'
    }

    @Override
    public void onPause() {
        super.onPause();
        getPresenter().detachView();
    }
}

public class MyPresenter extends BasePresenter<MyPresenter.MyView> {
    @Inject
    public MyPresenter() {}

    public interface MyView {}
}

public class MyFragment extends BaseFragment<MyFragment, MyPresenter> implements MyPresenter.MyView {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyFragmentComponent component = ((MainActivity)getActivity()).getComponent().myFragmentComponent();
        component.inject(this);
        View view = inflater.inflate(R.layout.blah, container, false);
        ButterKnife.bind(this, view);
        return view;
    }
}



EDIT2:基于提供的示例:

public class RexTester {
    // MAIN CLASS

    static class Rextester {
        public static void main(String args[]) {
            new MyFragment();
        }
    }

// MVP CODE

    interface BaseView {}

    final static class MyPresenter extends BasePresenter<MyPresenter.MyView> {

        public MyPresenter() {}

        public void executeAction() {
            mView.onCallback();
        }

        interface MyView extends BaseView {
            void onCallback();
        }

    }

    abstract static class BasePresenter<V extends BaseView> {

        protected V mView;

        public void attachView(V view) { mView = view;}
        public void detachView() { mView = null; }

    }

    final static class MyFragment extends BaseFragment<MyPresenter.MyView, MyPresenter> implements MyPresenter.MyView {

        private MyPresenter mPresenter;

        public MyFragment() {
            mPresenter = new MyPresenter();

            onResume(); // Mock onResume() lifecycle event!

            mPresenter.executeAction();

            onPause(); // Mock onPause() lifecycle event!
        }

        protected MyPresenter getPresenter() {
            return mPresenter;
        }

        @Override
        protected MyPresenter.MyView getThis() {
            return this;
        }

        public void onCallback() {
            System.out.println("Hello AndroidMVP!");
        }
    }

    abstract static class BaseFragment<V extends BaseView, P extends BasePresenter<V>> extends Fragment implements BaseView {

        protected abstract P getPresenter();

        protected void onResume() {
            super.onResume();
            getPresenter().attachView(getThis());
        }

        protected abstract V getThis();

        protected void onPause() {
            super.onPause();
            getPresenter().detachView();
        }
    }

// ANDROID FRAMEWORK MOCK

    abstract static class Fragment {

        protected void onResume() {}

        protected void onPause() {}

    }
}