Scala默认类型化列表的类型为String
这里是Scala 2.12。我有以下课程: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
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,但是用同一个名字来表示多个事物不是一个好主意。这会使你的代码不清晰。