2013-12-24 13 views
1
내가 스칼라에 마틴 오더 스키의 프로그래밍에 추상적 인 유형의 동물/식품 예를하려고했다

, 스칼라에 관련된 추상 유형이 없을 때 동적 바인딩이 없습니까?

class Food 
abstract class Animal { 
    type SuitableFood <: Food 
    def eat(food:SuitableFood) 
} 
class Grass extends Food 
class Cow extends Animal { 
    type SuitableFood=Grass 
    override def eat(food:SuitableFood) {} 
} 
val bessy:Animal = new Cow 
bessy.eat(new Grass) 

나는 다음과 같은 오류있어 : 마틴에 의해 원래의 예는 bessy.eat(new Fish)

scala> <console>:13: error: type mismatch; 
found : Grass 
required: bessy.SuitableFood 
        bessy.eat(new Grass) 
          ^

했다 , 확실히 실패 할 것입니다, 그러나 나는 그것이 Grass을 위해 또한 실패 할 것이라는 점을 예상하지 않았습니다. 위 오류는 을 Animal : val bessy:Cow = new Cow 대신 Cow이되도록 놓으면 피할 수 있습니다.

여기서 동적 바인딩이 작동하지 않는다는 의미입니까?

편집 : 간단한 동적 스칼라에서 일반 상속 바인딩 :

abstract class Parent { 
    def sig:String = "Parent" 
} 
class Child extends Parent { 
    override def sig:String = "Child" 
} 

그리고 x:Parent뿐만 아니라 아이 준 곳이 있었다 :

scala> new Child().sig 
res1: String = Child 

val x:Parent = new Child() 
x: Parent = [email protected] 

x.sig 
res2: String = Child 

답변

6

스칼라는 정적으로 입력됩니다 . 임의의 동물은 풀을 먹을 수 없으며, 당신은 방금 임의의 동물에게 풀을 먹이려고했습니다. 그것은 암소가 되겠지만 컴파일러가 동물이라고 추정 할 수 있다고 명시했습니다 (: Animal 포함).

bessyCow (val bessy = new Cow)이라는 것을 컴파일러에서 알게되면 잔디를 잘 먹게됩니다.

+0

글쎄, 내가 동적 바인딩 개념을 잘못 생각하고 있습니까? Java의'List'는'LinkedList'와'ArrayList'를 가지고 있습니다. 그래서'List'에'xs.get (idx)'를 호출하면,'ArrayList' 구현 일 때'ArrayList' 버전을 얻을 수 있습니다. 나는 스칼라가 이것에서 벗어날 것을 기대하지 않았다. – lcn

+0

@lcn - 유형이 일치해야합니다. 당신의 "간단한"예제는'Parent.sig'와'Child.sig'와 같은 타입 시그니처를 가지고 있습니다. C++에서 "동적 바인딩"유형의 상속은 잘 작동하지만 주어진 유형을 따라야합니다. –

+0

그래서 추상적 인 타입이 관련되어있을 때,'eat' 메소드는 * 다른 * 시그니처를 가지므로 다른 메소드입니까? 이 유형은 추상적 유형의 목적에 더 잘 어울린다는 것을 이해하지만 실제로 여기에 * NO * 동적 바인딩이 있음을 문서화해야합니다. – lcn