为什么';t Kotlin使用'List(…)`作为列表的工厂,并对所有抽象集合使用类似的约定?

为什么';t Kotlin使用'List(…)`作为列表的工厂,并对所有抽象集合使用类似的约定?,kotlin,Kotlin,在Scala中,有一种方便的约定,即使用伴随对象的apply方法,通过伴随对象提供集合工厂方法。所以,如果我想创建一个包含元素1、2和3的列表,我只需要使用list(1、2、3)。该模式在所有集合类型中都是一致的 在Kotlin中,如果我写List(1,2,3)我会得到一个编译错误。要创建包含1、2和3的列表,必须使用listOf(1、2、3)列表是一个接口,因此它显然没有构造函数。可能有一个伴星,但没有。有一个List函数,但它的签名与Scala中的签名不同(public inline fun

在Scala中,有一种方便的约定,即使用伴随对象的
apply
方法,通过伴随对象提供集合工厂方法。所以,如果我想创建一个包含元素1、2和3的列表,我只需要使用
list(1、2、3)
。该模式在所有集合类型中都是一致的

在Kotlin中,如果我写
List(1,2,3)
我会得到一个编译错误。要创建包含1、2和3的列表,必须使用
listOf(1、2、3)
<代码>列表是一个接口,因此它显然没有构造函数。可能有一个伴星,但没有。有一个
List
函数,但它的签名与Scala中的签名不同(
public inline fun List(size:Int,init:(index:Int)->T):List

那么,为什么Kotlin收藏库的设计者选择不遵循与Scala中的收藏工厂类似的统一惯例呢

为什么Kotlin馆藏库的设计师选择不遵循馆藏工厂的统一惯例

有一个“统一约定”:使用Kotlin标准库函数
listOf
arrayOf
mapOf
等,如以下所述:

Kotlin没有用于创建列表或集合的专用语法构造使用标准库中的方法,例如
listOf()
mutableListOf()
setOf()
mutableSetOf()

我不知道为什么Scala方法实际上会更好。如果您希望拥有类似构造函数的函数,那么创建它们也没什么大不了的:

fun <T> List<T>(vararg e: T) = listOf(e)

//use it
val l = List(1, 2, 3, 4)
fun List(vararg e:T)=listOf(e)
//使用它
val l=列表(1,2,3,4)

我们同样可以扭转标题问题——为什么Kotlin应该有一个列表(…)创建方法?你说的“制服”是什么意思?还请注意,有不止一个创建方法—listOf、mutableListOf等。另一篇文章解释了为什么工厂函数名与类函数名相同不是一个好做法。对于接口或抽象类,最好为类、接口和抽象类使用一致的工厂函数命名样式。@BakaWaii,除了问题提到的,Kotlin库中有一个同名的工厂函数。您已经解释了如何命名,但没有解释原因。这不仅仅是一个随机选择。Kotlin将区分可变集合和不可变集合作为一项功能。他们希望在任何情况下,什么是可变的都是显而易见的。例如,这就是参数不可变的原因。不,这和这个问题完全无关