因此,我有一个模拟位字符串的类。这对于使用简单的旧整数列表将非常有用,但是为了进行一些实践,我想派生一个Kotlin集合。
我想派生一个基本的不可变集合。在Java中,List
是一个接口。在科特林,情况似乎也是如此。文档说是这样,所以逻辑上说它不能被实例化。但是...如果是这种情况,那么listOf()
返回什么?
在Kotlin REPL中运行一个简单的listOf()
可以得出表明List
可以实例化的结果。
listOf(1,2,3)
res: kotlin.collections.List<kotlin.Int> = [1, 2, 3]
我的问题是:
List
可以实例化吗? listOf
返回什么,为什么科特林说它是List
? 答案 0 :(得分:1)
listOf返回List接口的实现-EmptyList,Collections.singletonList(element)或elements.asList()
我想您应该将listOf精确用于第3点:)
答案 1 :(得分:1)
扩展r2rek的答案:
List
可以实例化吗?
不。与Java中一样,它是一个接口。*
(它与Java的不同之处主要在于Kotlin编译器隐藏了所有的变异方法。相反,这些方法可在新的子接口MutableList
中使用。这使得告诉编译器什么是可变的,什么是不可变的更容易。但是,JVM仅看到List
。)
REPL告诉您引用的类型,而不是它指向的具体类的类型。这是另一个示例:
>>> val n: Number = 1
>>> n
res1: kotlin.Number = 1
>>> n::class
res2: kotlin.reflect.KClass<out kotlin.Number> = class kotlin.Int
- 如果不是,那么
listOf
返回什么,为什么科特林说它是List
?
它返回List
的某些实现。它不会告诉您哪一个,您的代码也不应该知道或关心。 (如果这样做,则应该创建更具体的内容!)
listOf()
方法当然会知道它正在创建的具体类型,但是方法签名只是返回List
。这样可以为不同的输入返回不同的实现。
(例如,它可能为每个没有元素的调用返回相同的空列表实例;并且它可能会为大小列表选择不同的实现。以后的版本可以自由地对其性能进行调整。只要您的代码只依靠它返回实现List
的东西,那么它仍然可以正常工作。)
- 我应该扩展什么“基本”不可变集合[…],因为我希望最终得到一个具有过滤器/地图/索引/ etdc等功能的常规不可变集合。还有一些其他方法?
无论使用哪种类型的List
listOf()
,您都可以过得不错。
如果您需要一些非常不同寻常的行为,则可以编写自己的实现,但是99%的时间并没有真正的好处(并且有很多机会犯错并在未来的改进中失败)。
请记住,除了List
接口包含的基本方法之外,Kotlin还允许您使用标准库(any()
,associate()
,{{ 1}},chunked()
…)。因此,您可以“免费”获得大量功能!
(*为了迷惑这个问题,Kotlin确实有一个函数count()
。调用看起来就像调用构造函数一样,但不是!)