Я пытаюсь построить карту из входной карты, но компилятор не может доказать, что двухэлементный кортеж является двухэлементным кортежем.
код
class Element[T] extends AnyRef { }
class Sample
{
def makeList(x:Int): Element[_] = {
x match {
case 1 => new Element[Boolean]
case 2 => new Element[(Boolean, Boolean)]
}
}
val input = Map(1 -> "one",2 -> "two")
val output = input.map(e => e._1 -> makeList(e._1)).toMap
}
sbt compile
sbt:root> ~compile
[info] Compiling 1 Scala source to /Users/tda0106/test/scala/target/scala-2.12/classes ...
[error] /Users/tda0106/test/scala/src/main/scala/Test.scala:14:57: Cannot prove that (Int, Element[_$1]) forSome { type _$1 } <:< (T, U).
[error] val output = input.map(e => e._1 -> makeList(e._1)).toMap
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed Jun 27, 2019, 2:38:14 PM
Похоже, что проблема связана с forSome { type _$1 }
, иначе она должна совпадать. Когда я впервые попытался воспроизвести его, я использовал List
вместо Element
, и он скомпилировался. Похоже, что разница в том, что List
объявлен как List[+T]
, и здесь +
важен.
Element
из сторонней библиотеки, поэтому изменить ее сложно.
В чем проблема, с которой я здесь сталкиваюсь, и есть ли простой способ ее исправить?
Версия Scala: 2.12.8