2016-11-02 3 views
4

Ich habe gerade angefangen Scala und möchte einige Grundlagen klären. In der unteren Funktion ist die untere Grenze auf Puppy gesetzt. Wie kommt es, dass Puppy1 und Puppy2 im folgenden Code erlaubt ist?scala untere Grenze sollte die gleiche Hierarchie Objekte zulassen?

class Animal 
class Dog extends Animal 
class Puppy extends Animal 
class Puppy1 extends Animal 
class Puppy2 extends Puppy 

class AnimalCarer{ 
    def display [T >: Puppy](t: T){ 
    println(t) 
    } 
} 

val animal = new Animal 
val dog = new Dog 
val puppy = new Puppy 
val puppy1 = new Puppy1 
val puppy2 = new Puppy2 

val animalCarer = new AnimalCarer 
animalCarer.display(animal) 
animalCarer.display(puppy) 
animalCarer.display(puppy1) 
animalCarer.display(puppy2) 
animalCarer.display(dog) 
+0

Ich Sache 'T' gefüllt mit' Object' hier. – talex

+0

Der Compiler up-Cast auf einen Typ, der die Grenzen passt, wenn es möglich ist. –

Antwort

1

Da Sie nicht ausfüllen T ausdrücklich, versucht der Compiler es für Sie mit den richtigen Typen folgert diese Kompilierung zu machen:

animalCarer.display[testing.ParamTest.Animal](ParamTest.this.puppy1); 
animalCarer.display[testing.ParamTest.Puppy](ParamTest.this.puppy2); 
animalCarer.display[testing.ParamTest.Animal](ParamTest.this.dog) 

Dies ist Teil der Local Type Inference Algorithmus Scala. Wie Sie sehen, wird jedem Methodenaufruf das Recht T, z. B. puppy1: Animal, hinzugefügt, das sich an die Untergrenze-Einschränkung hält.

1

Dies ist ein klassisches Beispiel für Scala-Typ-Schlussfolgerung, die mit dem üblichen Begriff (Intuition) vermischt wird.

def foo[T >: Puppy](t: T) = t 

foo(new Puppy1) //compiles 

foo[Puppy1](new Puppy1) //give compilation error 

Scala REPL

scala> def foo[T >: Puppy](t: T) = t 
foo: [T >: Puppy](t: T)T 

scala> foo(new Puppy1) 
res9: Animal = [email protected] 

scala> foo[Puppy1](new Puppy1) 
<console>:16: error: type arguments [Puppy1] do not conform to method foo's type parameter bounds [T >: Puppy] 
     foo[Puppy1](new Puppy1) 
    ^
Verwandte Themen