2012-03-23 19 views
8

Uczę się Scala i mam pytanie dotyczące dolnej granicy.O dolnej granicy Scala

Mam klasy:

class Queue[+T] { 
    def enqueue[U>:T](x : U) = new Queue[U]() 
} 

class Fruit 
class Apple extends Fruit 
class Orange extends Fruit 
class Another 

Co znalazłem jest, że do kolejki dowolnego typu, np:

val q1 = new Queue[Fruit] 

Wszystkie trzy linie poniżej minie skompilować

q1.enqueue(new Apple) 
    q1.enqueue(new Orange) 
    q1.enqueue(new Another) 

Moje pytanie brzmi: jeśli użyjemy dolnej granicy do zdefiniowania U musi być super typem T, w liniach powyżej, Apple wyraźnie nie jest takie wyższy typ Fruit, jak można go przekazać do funkcji kolejkowania?

Klasa "Inna" w ogóle nie jest w hierarchii owoców, jak może być użyta w funkcji kolizji?

Proszę, pomóżcie mi z tym.

Pozdrowienia Kevin

+0

Wyobraź dwukropka '>:' 'jako równe> =' –

+0

miałem również samo pytanie. poniższe odpowiedzi wyjaśniły moje wątpliwości. powinieneś zaakceptować odpowiedź poniżej. – weima

Odpowiedz

12

Jeśli spojrzeć co zwrócić nowych kolejek:

scala> q1.enqueue(new Apple) 
res0: Queue[Fruit] = [email protected] 

scala> q1.enqueue(new Orange) 
res1: Queue[Fruit] = [email protected] 

scala> q1.enqueue(new Another) 
res2: Queue[ScalaObject] = [email protected] 

Co mówiłeś, że szczególnie u powinny być super typ T (lub T). Oznacza to, że Another działa świetnie, ponieważ ScalaObject jest najbardziej specyficznym supertypem zarówno Innego, jak i Owocowego.

5

Moje pytanie brzmi: jeśli użyjemy dolnego ograniczenia do zdefiniowania U musi być super typem T, w liniach powyżej, Apple wyraźnie nie jest supertypem Owocu, jak można go przekazać do funkcji kolejkowania ?

Ale new Apple jest Fruit i Fruit jest supertypem z Fruit. Tak więc w twoim przypadku U jest Fruit i zwracana jest Queue[Fruit]. I new Another jest ScalaObject, który jest również supertypem z Fruit ...

+0

to wyjaśnienie rozwiązuje moje zamieszanie – abelard2008