Scala默认类型化列表的类型为String

Scala默认类型化列表的类型为String,scala,collections,Scala,Collections,这里是Scala 2.12。我有以下课程: abstract class AbstractCollector { def name() : String def collect() : Map[String,AnyVal] } class NativeSystemCollector(sysInfo : SystemInfo) extends AbstractCollector { override def name(): String = "NativeSystem" ove

这里是Scala 2.12。我有以下课程:

abstract class AbstractCollector {
  def name() : String
  def collect() : Map[String,AnyVal]
}

class NativeSystemCollector(sysInfo : SystemInfo) extends AbstractCollector {
  override def name(): String = "NativeSystem"

  override def collect(): Map[String, AnyVal] = ???
}
现在我正在尝试编写一个“provider”方法,它返回一个
列表[AbstractCollectors]

def nativeSystemCollector() : NativeSystemCollector = new NativeSystemCollector(systemInfo())

def collectors() : List[AbstractCollector] = {
  var collectors = List[AbstractCollector]()

  collectors += nativeSystemCollector()

  collectors
}
这段代码在
collector+=nativeSystemCollector()
处给了我一个编译器错误:

类型不匹配,应为:字符串,实际为:NativeSystemCollector


当我清楚地将
收集器
声明为一个新的
抽象收集器
列表时,编译器为什么认为它是一个字符串列表

它不认为
收集器
是一个
列表[字符串]

相反,它注意到
收集器
是不可变的,并且没有
+=
方法。所以它试着去糖

collectors += nativeSystemCollector()
进入

然后不知道
+
是什么意思。由于
列表上没有
+
方法,它会隐式地将
收集器
转换为
字符串
,但随后会注意到
nativeSystemCollector()
不是另一个
字符串
,并放弃

如果要通过附加元素来构造列表,请改用可变的
ListBuffer

val collectors = collection.mutable.ListBuffer[AbstractCollector]()

collectors += nativeSystemCollector()

collectors.toList

附加到
列表
无论如何都很昂贵。

它不认为
收集器
是一个
列表[字符串]

相反,它注意到
收集器
是不可变的,并且没有
+=
方法。所以它试着去糖

collectors += nativeSystemCollector()
进入

然后不知道
+
是什么意思。由于
列表上没有
+
方法,它会隐式地将
收集器
转换为
字符串
,但随后会注意到
nativeSystemCollector()
不是另一个
字符串
,并放弃

如果要通过附加元素来构造列表,请改用可变的
ListBuffer

val collectors = collection.mutable.ListBuffer[AbstractCollector]()

collectors += nativeSystemCollector()

collectors.toList

添加到
列表
无论如何都很昂贵。

处理可变列表时,应该在
列表
上使用
ListBuffer
。例如:

def collectors() : List[AbstractCollector] = {
  var collectorList: ListBuffer[AbstractCollector] = ListBuffer[AbstractCollector]()

  collectorList += nativeSystemCollector()

  collectorList.toList
}
如果确实要使用
列表
,请使用
:+
符号:

def collectors() : List[AbstractCollector] = {
  val collectorList: List[AbstractCollector] = List[AbstractCollector]()

  collectorList :+ nativeSystemCollector()
}
查看
+=
,它的构造如下:

implicit final class any2stringadd[A](private val self: A) extends AnyVal {
  def +(other: String): String = String.valueOf(self) + other
}
由于List[AbstractCollector]没有
+=
方法,我认为它假定您正在处理字符串,然后就失败了


阅读有关添加到列表的更多信息。

处理可变列表时,应在
List
上使用
ListBuffer
。例如:

def collectors() : List[AbstractCollector] = {
  var collectorList: ListBuffer[AbstractCollector] = ListBuffer[AbstractCollector]()

  collectorList += nativeSystemCollector()

  collectorList.toList
}
如果确实要使用
列表
,请使用
:+
符号:

def collectors() : List[AbstractCollector] = {
  val collectorList: List[AbstractCollector] = List[AbstractCollector]()

  collectorList :+ nativeSystemCollector()
}
查看
+=
,它的构造如下:

implicit final class any2stringadd[A](private val self: A) extends AnyVal {
  def +(other: String): String = String.valueOf(self) + other
}
由于List[AbstractCollector]没有
+=
方法,我认为它假定您正在处理字符串,然后就失败了


阅读有关添加到列表的更多信息。

可能值得重命名def或var,以便您了解它所指的
收集器。编辑:我知道它指的是var,但是用同一个名字来表示多个事物不是一个好主意。它使您的代码不清楚。可能需要重命名def或var,以便您知道它所指的是哪个
收集器。编辑:我知道它指的是var,但是用同一个名字来表示多个事物不是一个好主意。这会使你的代码不清晰。