Acabo de ver esta charla de Daniel Spiewak donde él habla sobre las ventajas de tipificación estructural en comparación con tipificación nominal de Scala y en 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.
Por otro lado, un sistema de tipo estructural podría declarar que ambos tipos son iguales o compatibles y, por lo tanto, entre otras cosas, permitir la tipificación de pato controlado.
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 tipos 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
¿Tengo entendido 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 tipos?