2017-08-19 23 views
1

我将通过传递我的通用字段(演示者)来实现片段的初始化,然后将此演示者连接到创建的视图。Java中的静态通用字段

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; 
} 

但似乎通用静态字段是不允许的。我如何处理这个问题?

+0

@ lvl4fi4 Java不关心使用哪个。私人静态或静态私人。 – Kenji

+0

你可以使用对象并在以后投射吗? – lvl4fi4

回答

0

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); 

顺便提及,在一个静态变量可能导致存储器(Activity)泄漏具有Fragment。当Fragment销毁时,您是否清除该字段?如果没有,您正在泄漏您的Fragment和绑定Activity以及其中的所有Views

+0

我从这里开始的所有问题,起初我使用片段的构造函数并传递它的演示者,但是导致一些片段崩溃。使用片段构造函数并不好。然后我来静态方法,这发生了。 – Kenji

+0

是的。我错过了它是片段的事实。片段应该有一个公共的空构造函数。在片段重新创建过程中被系统调用。我已经更新了答案。 – Bob