表現タイプを持つトレイトは自己参照であるため、変数がそのトレイトのインスタンスを保持していることを宣言するのは少し難しいです。この例では、変数がトレイトのインスタンスを保持していることを宣言し、関数がそのトレイトのインスタンスを取得して返すことを宣言し、変数を使用してその関数を呼び出します。
trait Foo[+A <: Foo[A]]
case class Bar() extends Foo[Bar]
case class Grill() extends Foo[Grill]
// Store a generic instance of Foo
val b: Foo[_] = if(true) {
Bar()
} else {
Grill()
}
// Declare a function that take any Foo and returns a Foo of the same type
// that "in" has in the calling context
def echoFoo[A <: Foo[A]](in: A): A = in
// Call said function
val echo = echoFoo(b)
次のエラーで失敗します。
inferred type arguments [this.Foo[_$1]] do not conform to method
echoFoo's type parameter bounds [A <: this.Foo[A]]
val echo = echoFoo(b)
^
さて、これは(私が完全には理解していない方法で[_]
)のようなものであるため、理にかなっています。Any
おそらく必要なのはFoo[Foo[_]]
、のようなもので、typeパラメーターは。の境界に準拠しますA <: Foo[A]
。しかし、現在、Foo
不適合な型パラメーターを持つ内部があり、解がのようなものであることを示唆していますがFoo[Foo[Foo[Foo[...
、これは明らかに正しくありません。
だから私の質問はおそらく次のように要約することができます:「この変数は正当なものを保持します」のScala構文は何Foo
ですか?