在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中实现相同的代码
答案 0 :(得分:5)
答案 1 :(得分:1)
引自Docs:&#34; Java的原始类型转换为星形投影,List
变为List<*>
!,即List<out Any?>
!。 &#34;
因此,您可以像<*>
一样使用星标投影。
答案 2 :(得分:1)
从技术上讲,星形投影不是原始类型。 Kotlin不支持原始类型。您不能定义原始类型的变量,也不能定义原始类型的方法参数。它不会编译。
如果使用星状投影,对它几乎没有帮助,因为您无法做很多事情。因此,您最终将其转换为所需的类型,用手指指着最好的东西。最好是避免使用原始类型的Java API。
或创建该泛型类的自己的变量,然后将所有信息安全地传递给它。如果它是一个Collection,则对其进行迭代并将元素放入新的Collection中。因为元素或集合本身可以为null,所以它也可以使您免于null指针异常。
顺便说一句,在您的示例中,存在一些严重的设计缺陷。
(BaseActivity<*>getActivity())
或创建内存泄漏。 <*> 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 类型,科特林制作了“智能演员” 自动,因此您不必指定类型。