방금 Daniel Spiewak 가 Scala의 ans Java의 공칭 타이핑 과 비교하여 구조 타이핑 의 장점에 대해 이야기하는 것을 보았습니다 . 이 차이점의 한 가지 예는 다음 Java 코드입니다.
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
Foo
그리고 사이에 유형 호환성이 있기 때문에 컴파일되지 않을 것 Bar
입니다.
반면에 구조적 유형 시스템은 두 유형이 동일하거나 호환 가능하다고 선언 할 수 있으므로 무엇보다도 오리 입력을 확인할 수 있습니다.
이제 구조 유형 시스템의 장점을 대부분 이해한다고 생각하지만 다음과 같은 예제에서 유형 안전을 무효화하지 않을지 궁금합니다.
class Foo {
class Bar { /* ... */ }
def takeBar(b: Bar) = { /* ... */ }
def getBar: Bar = new Bar
}
val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile
구조적 유형 시스템에서 마지막 줄도 컴파일 될 것이며, 그렇다면 유형 안전성과 관련하여 불리한 점이 아님을 이해하고 있습니까?