Java中的静态通用字段

时间:2017-08-19 05:20:31

标签: java android generics static

我将通过传递我的通用字段(演示者)来实现片段的初始化,然后将此演示者连接到创建的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;
}

但似乎不允许使用通用静态字段。我怎么能处理这个?

1 个答案:

答案 0 :(得分:1)

来自Java doc

  

无法声明类型为类型参数的静态字段

     

类的静态字段是所有人共享的类级变量   类的非静态对象。因此,类型的静态字段   不允许参数。

这是不可能的,因为类BaseViewFragment的所有实例共享静态字段,如果允许,对于每个新BaseViewFragment实例,您可以指定新的Generic Type parameter。所以不允许这样做。

您可以做的是:使用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和绑定的Activity以及其中的所有Views