Kotlin – 在view.getTag()上的TypeCastException
我有一个名为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无法转换为非空typescom.dancam.subscriptions.Support.ItemClickSupport at com.dancam.subscriptions.Support.ItemClickSupport $ Companion.addTo(ItemClickSupport.kt:80)at 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 ) { ... } })
我错过了什么?
从Kotlin参考( https://kotlinlang.org/docs/reference/typecasts.html ):
“不安全”的演员
通常,如果转换不可行,转换运算符将抛出exception。 因此,我们称之为不安全的。 Kotlin中的不安全转换由中缀运算符完成(请参阅运算符优先级):
val x: String = y as String
请注意,null不能转换为String,因为此types不可为空,即如果y为null,则上面的代码将引发exception。 为了匹配Java转换语义,我们必须在右手边有空的types,如:
val x: String? = y as String?
您也可以使用所谓的“安全”(可空)投射算子,据我所知,它是等价的:
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