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