Kotlin列表...“可实例化”的界面吗?

时间:2019-06-19 11:39:56

标签: inheritance kotlin collections abstract-class

因此,我有一个模拟位字符串的类。这对于使用简单的旧整数列表将非常有用,但是为了进行一些实践,我想派生一个Kotlin集合。

我想派生一个基本的不可变集合。在Java中,List是一个接口。在科特林,情况似乎也是如此。文档说是这样,所以逻辑上说它不能被实例化。但是...如果是这种情况,那么listOf()返回什么?

在Kotlin REPL中运行一个简单的listOf()可以得出表明List可以实例化的结果。

listOf(1,2,3)
res: kotlin.collections.List<kotlin.Int> = [1, 2, 3]

我的问题是:

  1. List可以实例化吗?
  2. 如果不是,那么listOf返回什么,为什么科特林说它是List
  3. 还有什么“基本的”不可变集合(已经实现了,所以我不必从头开始实现)我应该知道自己想要以带有过滤器/映射/索引等功能的常规不可变集合作为结束/ etdc。还有一些其他方法?

2 个答案:

答案 0 :(得分:1)

listOf返回List接口的实现-EmptyList,Collections.singletonList(element)或elements.asList()

我想您应该将listOf精确用于第3点:)

答案 1 :(得分:1)

扩展r2rek的答案:

  
      
  1. List可以实例化吗?
  2.   

不。与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
  
      
  1. 如果不是,那么listOf返回什么,为什么科特林说它是List
  2.   

它返回List的某些实现。它不会告诉您哪一个,您的代码也不应该知道或关心。 (如果这样做,则应该创建更具体的内容!)

listOf()方法当然会知道它正在创建的具体类型,但是方法签名只是返回List。这样可以为不同的输入返回不同的实现。

(例如,它可能为每个没有元素的调用返回相同的空列表实例;并且它可能会为大小列表选择不同的实现。以后的版本可以自由地对其性能进行调整。只要您的代码只依靠它返回实现List的东西,那么它仍然可以正常工作。)

  
      
  1. 我应该扩展什么“基本”不可变集合[…],因为我希望最终得到一个具有过滤器/地图/索引/ etdc等功能的常规不可变集合。还有一些其他方法?
  2.   

无论使用哪种类型的List listOf(),您都可以过得不错。

如果您需要一些非常不同寻常的行为,则可以编写自己的实现,但是99%的时间并没有真正的好处(并且有很多机会犯错并在未来的改进中失败)。

请记住,除了List接口包含的基本方法之外,Kotlin还允许您使用标准库(any()associate(),{{ 1}},chunked()…)。因此,您可以“免费”获得大量功能!


(*为了迷惑这个问题,Kotlin确实有一个函数count()。调用看起来就像调用构造函数一样,但不是!)