Из вопроса не ясно, но я предполагаю, что вы создали список списков строк, аннотировали его как списки списков любых, и вы удивляетесь, почему типы не совпадают.
Несколько вещей:
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]
).