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

例如

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


不负相思意
浏览 137回答 2
2回答

Cats萌萌

Java 到 Kotlin 转换器工作正常,它生成等效的代码。您的 Java 代码包含显式强制转换,Kotlin 代码也会包含它们。如果您想要所描述的行为,请首先转到 的 Android 9 通用语法findViewById。然后这段Java代码// Oldfinal TextView view0 = (TextView)activity.findViewById(id);// Newfinal View&nbsp; &nbsp; &nbsp;view1 = activity.findViewById(id);final TextView view2 = activity.findViewById(id);// Not usefulfinal View&nbsp; &nbsp; &nbsp;view3 = activity.<TextView>findViewById(id);将转换为这个 Kotlin 代码val view0 = activity.findViewById<View>(id) as TextViewval view1 = activity.findViewById<View>(id)val view2 = activity.findViewById<TextView>(id)val view3 = activity.findViewById<TextView>(id)

湖上湖

您可以为这样的代码打开警告。转到(设置 -> 编辑器 -> 检查 -> Kotlin Android -> Cast 可以使用类型参数转换为 findViewById)并将严重性切换为警告。我不认为 conventer 本身可以被教导应该将这个特定的演员转换为其他东西。事实上,我想说这是预期的行为。请注意,在 Android SDK 28 以上,即使在 java 中也不需要该转换:public void hideChildTextView(View parent, @IdRes int id) {&nbsp; &nbsp; TextView view = parent.findViewById(id);&nbsp; &nbsp; view.setVisibility(View.GONE);}该代码将被翻译为:fun hideChildTextView(parent: View, @IdRes id: Int) {&nbsp; &nbsp; val view = parent.findViewById<TextView>(id)&nbsp; &nbsp; view.visibility = View.GONE}这是因为类型可以从归档类型中获取,并且不需要强制转换(或者它实际上是由库强制转换的)。那么,我们来看看28以下的SDK中的其他代码:public void hideChildTextView2(View parent, @IdRes int id) {&nbsp; &nbsp; TextView view = (TextView) parent.findViewById(id);&nbsp; &nbsp; view.setVisibility(View.GONE);}这将转换为:fun hideChildTextView2(parent: View, @IdRes id: Int) {&nbsp; &nbsp; val view = parent.findViewById(id) as TextView&nbsp; &nbsp; view.visibility = View.GONE}那么,这是为什么呢?android 28 下面的方法findViewById仅返回 View (因此我们需要将其转换为正确的类型),但上面的方法返回<T extends View>,因此编译器能够进行自动转换。那么,我会建议什么呢?将您的编译/目标 SDK 更新到 28+,清理 Java 中的代码,然后它就会按您想要的方式工作。;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java