Преобразование ListBuffer [List [Any]] Элементы любого типа в предполагаемые типы - PullRequest
0 голосов
/ 09 сентября 2018

Я создал ListBuffer[ List[Any]] (), который имеет следующий вывод:

   for (x <- list_buff){
        println(x)
    }

/** =======OutPut==================
    List(List(i), List(feel))
    List(List(feel), List(good))
    List(List(good), List(when))
    List(List(when), List(i))
    List(List(i), List(am))
    ............
=================**/

Так что List[List[String],List[String]], так что вывод типа должен это выяснить. Однако, когда я пытаюсь применить методы List, такие как map(), isEmpty или даже toList, я получаю ошибки, такие как методы не могут работать с типом Any. Более того, мне также не удается использовать общий метод toList. Как я могу решить это? Я попытался использовать ListBuffer[ List[ List[String],List[String] ] ] для определения, но он говорит, что List принимает только один параметр.

1 Ответ

0 голосов
/ 09 сентября 2018

Из вопроса не ясно, но я предполагаю, что вы создали список списков строк, аннотировали его как списки списков любых, и вы удивляетесь, почему типы не совпадают.

Несколько вещей:

  • List действительно принимает только один параметр. List(List("a", "b"), List("c", "d")) имеет тип List[List[String]] не List[List[String], List[String]]
  • Тот факт, что toString во время выполнения печатает то, что печатает, является результатом работы List toString: s"List(${elements.mkString(", ")})". Это не значит, что компилятор знает тип
  • компилятор выводит тип из того, что он знает во время компиляции. Если вы создаете функцию, возвращающую List[List[Any]], она не имеет права «угадывать», что это будет List[List[String]]. Если это был val x = List(List("a", "b"), List("c", "d")), то он выведет тип так, как вы хотите.

По сути, вывод типа не волшебным образом угадывает, что у вас там. Он вычисляет наиболее конкретный тип, учитывая информацию о переменных, константах и ​​функциях, «наибольший общий знаменатель» в разговорной речи (или, в частности, «наименьший верхний предел»).

Если вы не аннотировали значения и в итоге получили Any, тогда у вас есть проблемы с кодом (вы не показали) - Any - это супертип всех других типов (top-type), и если это выглядит как выводимый тип, это означает, что компилятор должен был вывести общую часть вещей, которые не имеют ничего общего, поэтому, скорее всего, вы что-то напутали (например, List("a", 1) станет List[Any]).

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