2016-11-02 3 views
4

私はScalaを始めたばかりで、いくつかの基本をクリアしたいと思います。以下の関数の下限はPuppyに設定されています。どのようにPuppy1とPuppy2が下のコードで許可されるのですか?スカラー下限は同じ階層オブジェクトを許可する必要がありますか?

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'。 – 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) 

これはScalaのLocal Type Inferenceアルゴリズムの一部です。ご覧のように、それぞれのメソッド呼び出しは、つまりpuppy1: Animalのように右下の境界制約に従います。

1

これは、共通の概念(直感)を持つScala型推論の古典的な例です。ここで `Object`で満たさ

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) 
    ^
関連する問題