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 Fooe 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?