我有一个名为ItemClickSupport的类,它将ItemClick附加到RecyclerView:
这是init函数:
init {
mRecyclerView.setTag(R.id.item_click_support, this)
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener)
}
并有companion object
将其添加到recyclerView:
companion object {
fun addTo(view: RecyclerView): ItemClickSupport {
var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport
if (support == null) {
support = ItemClickSupport(view)
}
return support
}
}
当我运行我的应用程序并尝试将clickListener添加到recyclerView时,我得到了一个
引起:kotlin.TypeCastException:null无法强制转换为非null类型com.dancam.subscriptions.Support.ItemClickSupport 在com.dancam.subscriptions.Support.ItemClickSupport $ Companion.addTo(ItemClickSupport.kt:80) 在com.dancam.subscriptions.AddSubscription.AddSubscription.onCreate(AddSubscription.kt:79)
第一个错误指向addTo
函数中的这一行:
var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport
以及我main_activity
中的第二个:
ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener(
object: ItemClickSupport.OnItemClickListener {
override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View ) {
...
}
})
我错过了什么?
答案 0 :(得分:1)
来自Kotlin参考文献(https://kotlinlang.org/docs/reference/typecasts.html):
“不安全”的投射操作员
通常,如果强制转换,强制转换操作符会抛出异常 可能。因此,我们称之为不安全。 Kotlin的不安全演员阵容已经完成 由中缀运算符作为(参见运算符优先级):
val x: String = y as String
请注意,null不能转换为String,因为此类型不可为空, 即如果y为null,则上面的代码抛出异常。为了 匹配Java强制转换语义我们必须在强制转换中拥有可空类型 手边,像:
val x: String? = y as String?
你也可以使用所谓的“安全”(nullable)强制转换操作符,据我所知,该操作符是等效的:
val x: String? = y as? String
所以在你的具体案例中:
var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport?
或
var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as? ItemClickSupport