关于Scala的下限

Kev*_*vin 8 scala

我正在学习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中最具体的超类型.


Ale*_*nov 5

我的问题是:如果我们使用下界定义U必须是超类型的T,在上面的行中,Apple显然不是超类型的Fruit,它怎么能传递给enqueue函数?

但是,new Apple是一个Fruit,并且Fruit是一个超类型Fruit.所以在你的情况下UFruit,并Queue[Fruit]返回a.并且new Another是一个ScalaObject,也是Fruit... 的超类型