2017-08-19 4 views
0

Scalaにupperboundが存在する理由を理解しようとしています。彼らはコメント行がコメント解除された場合UpperboundsScalaの上限を理解する

class Animal 
class Dog extends Animal 
class Puppy extends Dog 

class AnimalCarer{ 
    def display [T <: Dog](t: T){ 
    println(t) 
    } 
} 

object ScalaUpperBoundsTest { 
    def main(args: Array[String]) { 

    val animal = new Animal 
    val dog = new Dog 
    val puppy = new Puppy 

    val animalCarer = new AnimalCarer 

    //animalCarer.display(animal) uncommenting this line leads to an error 
    animalCarer.display(dog) 
    animalCarer.display(puppy) 
    } 
} 

を説明しようとしている。このASNのサンプルコードは、エラーが発生します。あなたは

def display(t: Dog){ 
println(t) 
} 

ので、特にtは犬のサブタイプでなければなりませんコンパイラに指示する必要が何であるかにAnimalCarerdisplay方法を変更した場合しかし、あなたはまだエラーが出るのでしょうか?

+0

これはあまり意味がありません。 'display'メソッドは何かを' Dog'と呼びます。あなたは 'Animal'をコンパイルすべきではありません。 'Animal'は' Dog'ではないので、メソッドに提案された変更はまだ 'Animal'を渡すことができません。私はあなたの混乱を理解していません – pedromss

+0

@pedromss:私はなぜコンパイラがそれ自身でそれを検出するのに十分なインテリジェントであるとき、 "[T <:Dog](t:T)"というこの構文を与える必要があるのですか? – Ashwin

答えて

3

これはかなり役に立たない例のようです。あなたは正しい、def display[T <: Dog](t: T)はちょうどdef display(t: Dog)と等価であり、タイプパラメータは目的を果たさない。

私たちはあなたの例それをより便利にする少し変更することができます。

ここ
def display[T <: Dog](t: T): T = { 
    println(t) 
    t 
} 

あなたはPoodleに合格した場合、何を取り戻すことはまだPoodle、ではないので、typeパラメータは、便利ですちょうどいずれかDog

+0

えええええええええええば、これが犬であれば、「上界」という名前は混乱しないでしょうか?あなたの例では、引数として渡した正確な型(プードルの例)を返すことを確実にしているからです。これは「上向き」の唯一の目的ですか?可能であれば、より多くの例を挙げられますか? – Ashwin

+1

この場合のPARAMETER( 'T')型の目的は、あなたが渡したのと同じものを返すことです。BOUNDARY型(' <:Dog')の目的は、渡すものが ' 「猫」や「オウム」ではなく「犬」である – Dima