Jestem nowy w Scala, pochodzący z Pythona i próbuję objąć głowę niektórymi składniami i konwencjami. Jestem ciekawy, dlaczego następujące czynności nie działają:
scala> val tmp = List[Int].apply(1,2,3)
<console>:7: error: missing arguments for method apply in object List;
follow this method with `_" if you want to treat it as a partially applied function
val tmp = List[Int].apply(1,2,3)
Jednak gdy wykonuję następujące czynności, nie otrzymuję błędu:
scala> val tmp = List.apply(1,2,3)
tmp: List[Int] = List(1,2,3)
scala> val tmp = List[Int](1,2,3)
tmp: List[Int] = List(1,2,3)
Dlaczego List[Int].apply()
podać mi błąd?
Dzięki za pomoc!
Odpowiedzi:
12 dla odpowiedzi № 1Ponieważ twoja składnia jest zła. Jeśli chcesz odpowiednik List.apply(1,2,3)
, wtedy powinno być:
val tmp = List.apply[Int](1,2,3)
W wyrażeniu List.apply(1,2,3)
, List
odwołuje się do obiektu towarzyszącego, a obiekty nie mogą mieć generycznych. W związku z tym należy umieścić rodzajowy w metodzie.
Dla odniesienia można to zobaczyć w kodzie źródłowym dla List
:
object List extends SeqFactory[List] {
...
override def apply[A](xs: A*): List[A] = xs.toList
Kiedy piszesz List[Int].apply(1,2,3)
, Scala interpretuje to jako (List[Int]).apply(1,2,3)
. I List[Int]
jest interpretowany tak, jakby był List[Int]()
bez nawiasów, co jest równoważne List.apply[Int]
. Od apply
wymaga argumentu, Scala daje błąd informujący, że go brakuje.