为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法教 Android Studio 中的 java-> kotlin 转换器在转换

有没有办法教 Android Studio 中的 java-> kotlin 转换器在转换

不负相思意 2023-12-10 15:06:53
例如((MyView)view.findViewById(R.id.my_view)).doSomething()它转换成(view.findViewById(R.id.my_view) as MyView).doSomething()虽然我希望它是view.findViewById<MyView>(R.id.my_view).doSomething()
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

Java 到 Kotlin 转换器工作正常,它生成等效的代码。您的 Java 代码包含显式强制转换,Kotlin 代码也会包含它们。


如果您想要所描述的行为,请首先转到 的 Android 9 通用语法findViewById。


然后这段Java代码


// Old

final TextView view0 = (TextView)activity.findViewById(id);

// New

final View     view1 = activity.findViewById(id);

final TextView view2 = activity.findViewById(id);

// Not useful

final View     view3 = activity.<TextView>findViewById(id);

将转换为这个 Kotlin 代码


val view0 = activity.findViewById<View>(id) as TextView

val view1 = activity.findViewById<View>(id)

val view2 = activity.findViewById<TextView>(id)

val view3 = activity.findViewById<TextView>(id)


查看完整回答
反对 回复 2023-12-10
?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以为这样的代码打开警告。


转到(设置 -> 编辑器 -> 检查 -> Kotlin Android -> Cast 可以使用类型参数转换为 findViewById)并将严重性切换为警告。


我不认为 conventer 本身可以被教导应该将这个特定的演员转换为其他东西。事实上,我想说这是预期的行为。


请注意,在 Android SDK 28 以上,即使在 java 中也不需要该转换:


public void hideChildTextView(View parent, @IdRes int id) {

    TextView view = parent.findViewById(id);

    view.setVisibility(View.GONE);

}

该代码将被翻译为:


fun hideChildTextView(parent: View, @IdRes id: Int) {

    val view = parent.findViewById<TextView>(id)

    view.visibility = View.GONE

}

这是因为类型可以从归档类型中获取,并且不需要强制转换(或者它实际上是由库强制转换的)。


那么,我们来看看28以下的SDK中的其他代码:


public void hideChildTextView2(View parent, @IdRes int id) {

    TextView view = (TextView) parent.findViewById(id);

    view.setVisibility(View.GONE);

}

这将转换为:


fun hideChildTextView2(parent: View, @IdRes id: Int) {

    val view = parent.findViewById(id) as TextView

    view.visibility = View.GONE

}

那么,这是为什么呢?android 28 下面的方法findViewById仅返回 View (因此我们需要将其转换为正确的类型),但上面的方法返回<T extends View>,因此编译器能够进行自动转换。


那么,我会建议什么呢?将您的编译/目标 SDK 更新到 28+,清理 Java 中的代码,然后它就会按您想要的方式工作。;)


查看完整回答
反对 回复 2023-12-10
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信