2016-11-02 3 views
4

Я только что начал Scala и хочу очистить некоторые основы. В функции ниже Нижняя граница установлена ​​на Puppy. Почему Puppy1 и Puppy2 разрешены в приведенном ниже коде.scala нижняя граница должна допускать те же объекты иерархии?

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

я вещь 'T' заполнены' Object' здесь. – talex

+0

Компилятор подбрасывает тип, который соответствует границам, если это возможно. –

ответ

1

Поскольку вы не заливать T явно, компилятор пытается выводит его для вас с нужными типами, чтобы сделать эту компиляцию:

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

Это является частью Local Type Inference алгоритма в Scala. Как вы видите, каждый вызов метода выводится справа T, например, puppy1: Animal, который придерживается ограничения нижних границ.

1

Это классический пример вывода типа Scala, связанного с общим понятием (интуиция).

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

foo(new Puppy1) //compiles 

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

Scala РЕПЛ

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) 
    ^