我正在学习Scala,并对下限有疑问.
我有一节课:
class Queue[+T] {
def enqueue[U>:T](x : U) = new Queue[U]()
}
class Fruit
class Apple extends Fruit
class Orange extends Fruit
class Another
Run Code Online (Sandbox Code Playgroud)
我发现,对于任何类型的队列,例如:
val q1 = new Queue[Fruit]
Run Code Online (Sandbox Code Playgroud)
以下所有三行都将通过编译
q1.enqueue(new Apple)
q1.enqueue(new Orange)
q1.enqueue(new Another)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我们使用下界定义U必须是超类型的T,在上面的行中,Apple显然不是超类型的Fruit,它怎么能传递给enqueue函数?
"另一个"类根本不在果实层次中,它如何在入队函数中使用?
这个你能帮我吗.
关心凯文
tho*_*dge 12
如果您看一下新队列返回的内容:
scala> q1.enqueue(new Apple)
res0: Queue[Fruit] = Queue@17892d5
scala> q1.enqueue(new Orange)
res1: Queue[Fruit] = Queue@bdec44
scala> q1.enqueue(new Another)
res2: Queue[ScalaObject] = Queue@104bce3
Run Code Online (Sandbox Code Playgroud)
你所说的特别是U应该是超级型的T(或T).这意味着另一个很好用,因为ScalaObject是Another和Fruit中最具体的超类型.
我的问题是:如果我们使用下界定义U必须是超类型的T,在上面的行中,Apple显然不是超类型的Fruit,它怎么能传递给enqueue函数?
但是,new Apple是一个Fruit,并且Fruit是一个超类型Fruit.所以在你的情况下U是Fruit,并Queue[Fruit]返回a.并且new Another是一个ScalaObject,也是Fruit... 的超类型