我将通过传递我的通用字段(演示者)来实现 fragment 的初始化,然后将此演示者连接到创建的 View 。
public class BaseViewFragment <P extends BasePresenter> extends Fragment implements BaseView {
static private P presenter; //the problme is here, I do not allowed this
static private BaseViewFragment baseViewFragment;
.
.
.
public static <P extends BasePresenter> BaseViewFragment initialize(P presenter) {
if (baseViewFragment != null) {
presenter.setView(baseViewFragment);
} else {
baseViewFragment = new BaseViewFragment();
presenter.setView(baseViewFragment);
}
BaseViewFragment.presenter= presenter;
return baseViewFragment;
}
但似乎不允许使用通用静态字段。我该如何处理?
最佳答案
来自Java doc :
Cannot Declare Static Fields Whose Types are Type Parameters
A class's static field is a class-level variable shared by all non-static objects of the class. Hence, static fields of type parameters are not allowed.
这是不可能的,因为类 BaseViewFragment
的所有实例共享一个静态字段,如果允许,对于每个新的 BaseViewFragment
实例,您可以指定一个新的通用类型参数
。所以这是不允许的。
您可以做的是:使用 setPresenter
方法将 Presenter 实例传递给 Fragment 并进行初始化。
例如,
P presenter; // no need for static
public BaseViewFragment() {
}
public void setPresenter(P presenter) {
this.presenter = presenter;
}
设置演示者:
baseViewFragment = new BaseViewFragment();
baseViewFragment.setPresenter(presenter);
顺便说一下,在静态变量中有一个Fragment
可能会导致内存(Activity
)泄漏。您是否在 Fragment
销毁时清除该字段?否则,您将泄漏您的 Fragment
和绑定(bind)的 Activity
以及其中的所有 Views
。
关于java - Java 中的静态泛型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45767964/