2 回答

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)

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 中的代碼,然后它就會按您想要的方式工作。;)
添加回答
舉報