Ho appena visto questo discorso di Daniel Spiewak in cui parla dei vantaggi della tipizzazione strutturale rispetto alla tipizzazione nominale di Scala e Java . Un esempio di questa differenza sarebbe il seguente codice Java
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
che ovviamente non si compilerebbe perché la compatibilità dei tipi tra Foo
e Bar
è determinata dal nome.
Un sistema di tipo strutturale d'altra parte potrebbe dichiarare entrambi i tipi uguali o compatibili e quindi, tra le altre cose, consentire la tipizzazione di anatre verificate.
Ora penso di capire la maggior parte dei vantaggi di un sistema di tipo strutturale, ma mi chiedo se non invaliderebbe la sicurezza del tipo da esempi come i seguenti
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
La mia comprensione è corretta che in un sistema di tipo strutturale si compili anche l'ultima riga e, in tal caso, non sarebbe uno svantaggio rispetto alla sicurezza del tipo?