Acabei de assistir essa palestra de Daniel Spiewak, onde ele fala sobre as vantagens da tipagem estrutural em comparação com a tipagem nominal de Scala e Java . Um exemplo para essa diferença seria o seguinte código Java
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
que obviamente não seria compilado porque a compatibilidade de tipo entre Foo
e Bar
é determinada pelo nome.
Um sistema de tipo estrutural, por outro lado, poderia declarar que ambos os tipos são iguais ou compatíveis e, portanto, entre outras coisas, permitir a digitação de patos verificada.
Agora, acho que compreendo a maioria das vantagens de um sistema de tipo estrutural, mas me pergunto se isso não invalidaria a segurança de tipo de exemplos como os seguintes
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
Meu entendimento está correto de que, em um sistema de tipo estrutural, a última linha também seria compilada? Nesse caso, isso não seria uma desvantagem em relação à segurança de tipo?