Я щойно спостерігав за цим розмовою Даніеля Співака, де він розповідає про переваги структурного набору тексту порівняно з номінальним типізацією Scala і 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
Чи правильно я розумію, що в системі структурних типів останній рядок також буде складений, і якщо так, чи не буде це недоліком щодо безпеки типу?