为什么专家将MutableList更改为List?

Hel*_*oCW 2 kotlin

我问了一个问题,如何设计一个复杂的课程,在Kotlin将来可以轻松地扩展一些课程?关于如何设计一个复杂的类,其中包含一些类,以便将来在Kotlin中轻松扩展.

名为s1m0nw1的专家给出了一个很好的答案,如下面的代码.

但我不知道他为什么要换MutableListListhttps://stackoverflow.com/posts/47960036/revisions,我能得到正确的结果,当我使用MutableList.你可以告诉我吗?

代码

interface DeviceDef
data class BluetoothDef(val Status: Boolean = false) : DeviceDef
data class WiFiDef(val Name: String, val Status: Boolean = false) : DeviceDef
data class ScreenDef(val Name: String, val size: Long) : DeviceDef 


class MDetail(val _id: Long, val devices: List<DeviceDef>) {

    inline fun <reified T> getDevice(): T {
        return devices.filterIsInstance(T::class.java).first()
    }
}
Run Code Online (Sandbox Code Playgroud)

添加

我认为这mutableListOf<DeviceDef>ListOf<DeviceDef>将来扩展要好.

aMutableList.add()当我追加新的元素时,我可以使用函数来扩展 mutableListOf<DeviceDef>.

如果我使用ListOf<DeviceDef>,我必须用listOf(mBluetoothDef1, mWiFiDef1, //mOther)它构建,它不好.对?

var aMutableList= mutableListOf<DeviceDef>()

var mBluetoothDef1= BluetoothDef(true)
var mWiFiDef1= WiFiHelper(this).getWiFiDefFromSystem()

aMutableList.add(mBluetoothDef1)
aMutableList.add(mWiFiDef1)

// aMutableList.add(mOther)  //This is extension

var aMDetail1= MDetail(myID, aMutableList)
Run Code Online (Sandbox Code Playgroud)

s1m*_*nw1 5

很抱歉没有首先给出解释.文档中解释了这些差异:

与许多语言不同,Kotlin区分可变集合和不可变集合(列表,集合,映射等).精确控制何时可以编辑集合对于消除错误和设计良好的API非常有用.

重要的是要预先了解可变集合的只读视图与实际不可变集合之间的区别.两者都很容易创建,但类型系统没有表达差异,因此跟踪它(如果它是相关的)取决于你.

Kotlin List<out T>类型是一个提供只读操作的接口,如size,get等.就像在Java中一样,它继承自Collection<T>而且继承自Iterable<T>.MutableList<T>接口添加更改列表的方法.[...]

List接口提供了一个只读视图,因此您无法在列表中添加新元素,这在多线程环境中具有许多优点.可能存在您将使用的情况MutableList.

我还推荐以下讨论: Kotlin和Immutable Collections?

编辑(添加内容):

你可以这样做是一个没有任何add调用的单行:

val list = listOf(mBluetoothDef1, mWiFiDef1)
Run Code Online (Sandbox Code Playgroud)