因为具有表示类型的特征是自引用的,所以声明一个变量包含该特征的实例有点困难。在这个例子中,我简单地声明一个变量包含一个 trait 的实例,声明一个函数接受并返回该 trait 的实例,然后使用该变量调用该函数:
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[_]]
,以便类型参数符合A <: Foo[A]
. 但是现在有一个内部Foo
有一个不一致的类型参数,这表明解决方案类似于Foo[Foo[Foo[Foo[...
,这显然是不正确的。
所以我的问题可能可以归结为:“这个变量持有任何合法的Foo
”的Scala语法是什么?