如何修复 "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() {}
}
}
我已经在这里查找了很多关于这个问题的答案,但就我个人而言,我似乎无法解决这个问题,我需要一些帮助。
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() {}
}
}