Próbuję zbudować listę zestawów (zmienne i niezmienne). Kompilator wpada w kłopoty, ponieważ nie może określić typu tej listy. Zawsze myślałem, że mogę połączyć listy dowolnych typów i że typ nowej listy jest rodzajem nadtypu połączonych list. W poniższym przykładzie definiuję niektóre listy. Widać rodzaje tych wykazach, podane przez kompilator:Jak uzyskać listę zestawów (niezmiennych i zmiennych) w scala?
val intList = List(1) //List[Int]
val stringList = List("ab") //List[java.lang.String]
val mSetList = List(mutable.Set(1, 2, 3)) //List[scala.collection.mutable.Set[Int]]
val iSetList = List(immutable.Set(1, 2, 3)) //List[scala.collection.immutable.Set[Int]]
Teraz użyć operatora :::
łączenia tych list:
val intStringList = intList:::stringList //List[Any]
val intMSetList = intList:::mSetList //List[Any]
val intISetList = intList:::iSetList //List[Any]
Zgodnie z oczekiwaniami, kompilator oblicza wspólny supertypem (List[Any]
) z obu list. Ale dodaje się nie kompiluje:
val iSetmSetList = iSetList:::mSetList //type error
ale gdybym wyraźnie „cast” dwie listy, to działa:
val setList1 : List[scala.collection.Set[Int]] = mSetList //List[scala.collection.Set[Int]]
val setList2 : List[scala.collection.Set[Int]] = iSetList // List[scala.collection.Set[Int]]
val setList = setList1:::setList2 //List[scala.collection.Set[Int]]
Dlaczego muszę pomóc kompilatora, aby uzyskać prawidłowy typ że lista? I dlaczego powoduje błąd, a nie po prostu wpisuje go pod numerem List[Any]
? Czy teoretycznie niemożliwe jest obliczenie typu List[scala.collection.Set[Int]]
, czy jest to rodzaj błędu w kompilatorze?
dziękuję za odpowiedzi :-)
To sprawia, że myślę o http: // stackoverflow. com/questions/5734755/scala-type-wideening-inference-of-foott-tt, który został naprawiony za pomocą https://issues.scala-lang.org/browse/SI-4501. Czy warto spróbować z wieczornym nowszym brzmieniem niż 6/25? – huynhjl