Acabo de ver esta charla de Daniel Spiewak donde habla sobre las ventajas de la tipificación estructural en comparación con la tipificación nominal de Scala y Java . Un ejemplo de esta diferencia sería el siguiente código Java
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
que por supuesto no se compilaría porque la compatibilidad de tipos entre Foo
y Bar
está determinada por el nombre.
Un sistema de tipos estructurales, por otro lado, podría declarar que ambos tipos son iguales o compatibles y, por lo tanto, entre otras cosas, permitiría la tipificación de pato comprobada.
Ahora creo que entiendo la mayoría de las ventajas de un sistema de tipo estructural, pero me pregunto si no invalidaría la seguridad de tipo de ejemplos como los siguientes
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
¿Es correcto entender que en un sistema de tipo estructural la última línea también se compilaría y, de ser así, no sería una desventaja con respecto a la seguridad de tipo?