В Scala по умолчанию типизированный список имеет тип String - PullRequest
0 голосов
/ 22 мая 2018

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] = ???
}

Теперь я пытаюсь написать метод "провайдера", который возвращает List[AbstractCollectors]:

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

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

  collectors += nativeSystemCollector()

  collectors
}

Этот код дает мне ошибку компилятораat collectors += nativeSystemCollector():

" Несоответствие типов, ожидаемое: String, фактическое: NativeSystemCollector "

Любые идеи о том, почемуКомпилятор считает, что collectors - это список строк, когда я четко объявляю его новым списком AbstractCollectors?!?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы должны использовать ListBuffer над List при работе с изменяемыми списками.Например:

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

  collectorList += nativeSystemCollector()

  collectorList.toList
}

Если вы действительно хотите использовать List, используйте символ :+:

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] не имеет += метода, я думаю, он предполагает, что вы имеете дело со строками, и падает.

Подробнее здесь о добавлении в списки.

0 голосов
/ 22 мая 2018

Не думает, что collectors - это List[String].

Вместо этого он замечает, что collectors является неизменным и не имеет += метода.Поэтому он пытается десугар

collectors += nativeSystemCollector()

в

collectors = collectors + nativeSystemCollector()

, а затем не знает, что должен означать +.Поскольку в List нет метода +, он неявно преобразует collectors в String, но затем замечает, что nativeSystemCollector() не является другим String, и сдается.

Еслиесли вы хотите создать список путем добавления элементов, используйте вместо этого изменяемый ListBuffer:

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

collectors += nativeSystemCollector()

collectors.toList

Добавление к List в любом случае дорого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...