Kotlin - view.getTag()上的TypeCastException

时间:2017-11-15 15:23:11

标签: android kotlin

我有一个名为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 ) {
                        ...
                    }
                })

我错过了什么?

1 个答案:

答案 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