あなたは型推論システムの限界に遭遇していると思います。この上でいくつかの光を当てるために、我々はより多くの有用な出力を取得するには、このビット再定義するときに何が起こるか見てみましょう:最初の例で
class Bar[F[_], A](x: F[A], y: F[A]) {}
res0: Bar[List,Int] = [email protected]
new Bar(List(1,2,3), List(1))
res1: Bar[Any,Int] = [email protected]
new Bar(List(1), 1)
res2: Bar[Any,Int] = [email protected]
new Bar(List(1), Some(1))
<console>:12: error: inferred kinds of the type arguments (Product with java.io.Serializable,Int) do not conform to the expected kinds of the type parameters (type F,type A) in class Bar.
Product with java.io.Serializable's type parameters do not match type F's expected parameters:
<refinement of Product with java.io.Serializable> has no type parameters, but type F has one
new Bar(List(1), Some(1))
^
<console>:12: error: type mismatch;
found : List[Int]
required: F[A]
new Bar(List(1), Some(1))
^
<console>:12: error: type mismatch;
found : Some[Int]
required: F[A]
new Bar(List(1), Some(1))
を、我々は完璧な理にかなってBar[List, Int]
を持って、私たちは、渡されました2つList[Int]
。
2番目と3番目には、Bar[Any, Int]
があります。ここで奇妙なところがあります。 Any
はAnyVal
(ScalaのJavaプリミティブに相当する親)とAnyRef
(JavaのObjectに相当するScala)の親です(詳細はScala Documentationを参照してください)。
Scalaの型推論は、このBar
のコンストラクタはA
ためF
ためAny
、およびInt
を受け入れるべきであると決定しました。 Any
は確かにList
とInt
の親ですが、それは問題ありません。 List
は実際には[Int]
とパラメータ化されています。 ScalaはInt
もAny[Int]
であると言っても大丈夫です。私はその部分の良い説明がありません。
私は正直なところ混乱しています。これがバグかどうか疑問に思っています。何らかの理由で、List
とSome
の両方がAny
の子であり、どちらもInt
でパラメータ化されていても、それは許可されません。私はうまくコンパイラの推論方法の複雑さに精通していないよ怖いが、それは価値があるものを、明示的にこれらのパラメータを指定するために働く:私に
new Bar[Any,Int](List(1), Some(1))
res14: Bar[Any,Int] = [email protected]
が、それだけでできる型推論システムを提案しています」型を適切に推論したり、型が正しくないと推定したりします。
は両方とも 'Any'と' Nothing'ある種類の多型、参照、例えばだ場合
私は試行錯誤することにより、この動作を知ったが、私は知りません[SI-9248](https://issues.scala-lang.org/browse/SI-9248)。 –
btw 'bar(1、List(1))'は '2.9'ではコンパイルされませんが、' 2.10'ではコンパイルされます。 – dmitry