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

HelloCW

我在如何设计一个复杂的班级时问了一个问题,该班级包含一些班级以便将来在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()
    }
}

添加

我认为这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)
s1m0nw1

抱歉,没有首先给出解释。差异在docs中进行了解释

与许多语言不同,Kotlin区分可变集合不可变集合(列表,集合,地图等)。精确控制可编辑集合的确切时间,对于消除错误和设计良好的API很有用。

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

KotlinList<out T>类型是一个提供只读操作(如大小,获取等)的接口像Java中一样,它继承自,而继承Collection<T>又继承自Iterable<T>MutableList<T>界面会添加更改列表的方法[...]

List界面提供了只读视图,因此您不能例如在列表中添加新元素,例如,在多线程环境中,它具有许多优点。在某些情况下,您将使用它MutableList来代替。

我还建议以下讨论:Kotlin和不可变集合?

编辑(添加的内容):

您可以单行执行此操作,而无需任何add调用:

val list = listOf(mBluetoothDef1, mWiFiDef1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么2to3将mydict.keys()更改为list(mydict.keys())?

将代码从IEnumerable更改为List时,为什么代码可以正常工作?

为什么不建议在升级时将source.list更改为指向较新的版本?

为什么Javascript将0111数字参数更改为73

为什么ObjectMapper将Date类型更改为Long

为什么将&&更改为|| 导致看不到变量

为什么IntelliSense不断将功能更改为功能?

为什么休眠将HibernateException更改为(未选中)RuntimeException

为什么Firefox将align =“ center”更改为align =“ middle”?

为什么jquery.serialize将LF更改为CRLF?

为什么 gsub 会自动将 Factor 更改为 Character

为什么Rails 5将“索引”更改为“外键”?

将JSON.stringify更改为什么?

ffmpeg为什么将帧速率从60更改为120?

为什么 PHP 将加号图标更改为空格

当我通过config()将数组键更改为键时,为什么会更改?

为什么在scala中添加两个List [Map [String,Any]]将输出结果类型更改为List [Equals]?

当我将Kotlin中的MutableList <File>变量传递给List <File>时,Android Studio为什么不启动错误?

为什么GLSL更改为输入/输出?

为什么远程 git repo 没有将文件夹名称更改为小写

为什么不能在拒绝权限的情况下将目录更改为当前目录?

为什么在创建之前将当前目录更改为相对符号链接的父目录

将滚动方向从垂直更改为水平时,为什么收藏夹视图会崩溃?

为什么将std :: vector :: erase参数更改为const_iterator?

为什么将1 << 31更改为C ++ 14中的实现定义?

为什么将张量对象更改为tf.constant有效

为什么“ echo EHC1> / proc / acpi / wakeup”将“已启用”更改为“已禁用”

为什么create-react-app将App.js组件更改为基于功能的组件?

为什么 Typesript 编译器将 const 更改为 var?