为什么我在将 MutableLiveData 转换为 LiveData 时得到 "useless cast"?

Why do i get "useless cast" when casting MutableLiveData to LiveData?

我有一系列反馈渠道,因为(在问题范围之外)在我的 ViewModel.

现在,我不想将我的 MutableLiveData 暴露在 Viewmodel 之外。

因此,我创建了一个包含 LiveData 个对象的私有列表,但编译器抱怨“无用的转换”

private val _feedbackChannels = Array(10) { MutableLiveData<FeedbackEvent>() }
val feedbackChannels
    get() = _feedbackChannels.map{
        @Suppress("USELESS_CAST") // it is not useless as it no longer exposes the mutableLiveData
        it as LiveData<*>
    }

为什么我会收到 USELESS_CAST 警告?

编译器没有意识到您这样做只是为了强制暗示 属性 类型。

只需明确指定类型,您就可以完全放弃强制转换。您甚至不必使用地图,一个简单的 toList() 即可:

private val _feedbackChannels = Array(10) { MutableLiveData<FeedbackEvent>() }
val feedbackChannels : List<LiveData<FeedbackEvent>>
    get() = _feedbackChannels.toList()

显然编译器不理解转换的意义。为了以更明确的方式执行此操作并删除昂贵的 map 函数,您可以像这样向上转换它:

private val _feedbackChannels = Array(10) { MutableLiveData<FeedbackEvent>() }
val feedbackChannels: Array<out LiveData<FeedbackEvent>>
    get() = _feedbackChannels

编辑

如果您想专门公开一个 List(避免公开可变数组),那么您应该首先创建一个:

private val _feedbackChannels = List(10) { MutableLiveData<FeedbackEvent>() }
val feedbackChannels: List<out LiveData<FeedbackEvent>>
    get() = _feedbackChannels