Ich habe gerade diesen Vortrag von Daniel Spiewak gesehen, in dem er über die Vorteile der strukturellen Typisierung im Vergleich zur nominalen Typisierung von Scala und Java spricht . Ein Beispiel für diesen Unterschied wäre der folgende Java-Code
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
was natürlich nicht kompiliert werden würde, da die Typkompatibilität zwischen Foo
und Bar
namentlich festgelegt ist.
Andererseits könnte ein Strukturtypsystem erklären, dass beide Typen gleich oder kompatibel sind, und so unter anderem die Eingabe von Enten mit einem Häkchen ermöglichen.
Jetzt denke ich, dass ich die meisten Vorteile eines strukturellen Typensystems verstehe, aber ich frage mich, ob es die Typensicherheit nicht durch Beispiele wie das folgende ungültig machen würde
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
Ist mein Verständnis korrekt, dass in einem strukturellen Typensystem auch die letzte Zeile kompiliert wird, und wenn ja, wäre dies kein Nachteil in Bezug auf die Typensicherheit?