Android Studio Java转Kotlin后代码编译报错解决方案咨询
Android Java转Kotlin代码报错修复方案
报错根因
两处报错都是Java转Kotlin自动转换时的类型推断失误导致的:
- 列表泛型声明错误:自动转换生成的
MutableList<*>是Kotlin的星投影类型(等价于Java的List<?>),这类类型禁止调用add()等写入类方法,且初始化时写的ArrayList<Int>()和实际存入的字符串元素类型完全不匹配。 - 空安全智能转换限制:自动转换把所有View、适配器、列表变量声明成了可空的
var可变属性,Kotlin无法保证多线程场景下这些属性不会被修改为null,因此禁止直接调用其方法,触发智能转换失败报错。
修复后完整可运行代码
package com.varunsen.newcards import android.os.Bundle import android.widget.ArrayAdapter import android.widget.ListView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.swiperefreshlayout.widget.SwipeRefreshLayout class MainActivity : AppCompatActivity() { private lateinit var listView: ListView private lateinit var refreshLayout: SwipeRefreshLayout private lateinit var list: MutableList<String> private lateinit var adapter: ArrayAdapter<String> private lateinit var cardCount: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Toast.makeText(this, "Try Refreshing by swiping down.", Toast.LENGTH_LONG).show() // 控件初始化 listView = findViewById(R.id.listView) refreshLayout = findViewById(R.id.refreshLayout) cardCount = findViewById(R.id.card_count) // 列表数据初始化 list = arrayListOf("1", "2", "3", "4") cardCount.text = "Total Cards : ${list.size}" // 适配器绑定 adapter = ArrayAdapter(this, R.layout.card, list) listView.adapter = adapter // 下拉刷新逻辑 refreshLayout.setOnRefreshListener { list.add((list.size + 1).toString()) adapter.notifyDataSetChanged() cardCount.text = "Total Cards : ${list.size}" refreshLayout.isRefreshing = false } } }
关键修改说明
- 修正泛型声明:将错误的
MutableList<*>替换为明确的MutableList<String>,和实际存储的序号字符串类型匹配,解决add()方法调用报错的问题;下拉刷新新增的数字序号转为字符串后再加入列表,保证类型一致。 - 替换可空属性:将所有在onCreate中赋值、后续不会置空的控件、列表、适配器变量改为
lateinit延迟初始化的非空类型,既符合Kotlin空安全规范,也解决了智能转换失败的报错,无需每次调用都加!!非空断言。 - 清理冗余代码:移除自动转换生成的不必要类型强转、冗余作用域限定,将Java风格的setter调用替换为Kotlin推荐的属性访问语法,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Varun Sen
相关产品推荐
相关产品推荐

