如何在Kotlin中声明原始类型?

时间:2017-10-19 11:18:45

标签: java android kotlin

在Java中我可以声明这个

private List a;

//onCreate
a = new ArrayList()

但是在Kotlin中它显示错误,它迫使我特定一个类型

private List<String> a

有时我不想提供类型(我不需要),但它在Kotlin中显示错误 例如 在Java中

public abstract class BaseActivity<T extends ViewDataBinding> extends AppCompatActivity {
 //something
}

public abstract class BaseFragment {
 private BaseActivity activity;
 //something
}

//in kotkin I can't write
lateinit var activity: BaseAtivity //show error here (I have to specific a type but this is the base class and I do not want to specific a type here). I just want a reference of BaseActivity

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof BaseActivity) { //good in java but show error 
                                              //in kotlin because I have to //specific a type like BaseAtivity<something>
            BaseActivity activity = (BaseActivity) context;
            this.mActivity = activity;
            activity.onFragmentAttached();
        }
    }

我可以在Kotlin中编写什么来在java中实现相同的代码

4 个答案:

答案 0 :(得分:5)

您可以使用star projections

e.g。

private List<*> a

答案 1 :(得分:1)

引自Docs:&#34; Java的原始类型转换为星形投影,List变为List<*> !,即List<out Any?>!。 &#34;

因此,您可以像<*>一样使用星标投影。

答案 2 :(得分:1)

从技术上讲,星形投影不是原始类型。 Kotlin不支持原始类型。您不能定义原始类型的变量,也不能定义原始类型的方法参数。它不会编译。

如果使用星状投影,对它几乎没有帮助,因为您无法做很多事情。因此,您最终将其转换为所需的类型,用手指指着最好的东西。最好是避免使用原始类型的Java API。

或创建该泛型类的自己的变量,然后将所有信息安全地传递给它。如果它是一个Collection,则对其进行迭代并将元素放入新的Collection中。因为元素或集合本身可以为null,所以它也可以使您免于null指针异常。

顺便说一句,在您的示例中,存在一些严重的设计缺陷。

  1. 首先,您的片段中不应包含活动字段。每次您需要进行活动时,请致电(BaseActivity<*>getActivity())或创建内存泄漏。
  2. 接下来,您将Activity设置为通用,然后将其用作原始类型。这不会。如果您不在乎尖括号中的具体类型,请使用通配符<*> for Kotlin, <?> for Java.

答案 3 :(得分:0)

如果我理解得很好,您可能正在寻找这样的东西:

var activity: BaseAtivity? = null

override fun onAttach(context: Context?) {
    super.onAttach(context)
    context?.let { c ->
        if (c is BaseActivity) {
            activity = c //N1
            activity.onFragmentAttached()
        }
    }
}

N1:确认上下文(c)为                  BaseActivity 类型,科特林制作了“智能演员”                 自动,因此您不必指定类型。