java - Java 中的静态泛型字段

标签 java android generics static

我将通过传递我的通用字段(演示者)来实现 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/

相关文章:

java - Maven 测试范围

android - 下载数据和更新 UI

android - 如何过滤和执行特定的Gradle任务?

c - 使用 typeof 建立单一数据类型

c# - 类型推断神秘地失败

java - 删除默认的 Spring Boot 欢迎页面

java - 使用 JTextFields 或 JTextAreas 创建矩阵

android - SQLiteDatabase close() 函数在多个线程时导致 NullPointerException

android - 带有错误处理和进度对话框的通用 AsyncTask

java - 用Ehcache可以解决这个问题吗?