Saya baru saja menyaksikan pembicaraan oleh Daniel Spiewak ini di mana ia berbicara tentang keuntungan pengetikan struktural dibandingkan dengan pengetikan nominal Jawa Scala dan Jawa . Salah satu contoh untuk perbedaan ini adalah kode Java berikut
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
yang tentu saja tidak akan dikompilasi karena jenis kompatibilitas antara Foo
dan Bar
ditentukan oleh nama.
Sistem tipe struktural di sisi lain dapat menyatakan kedua jenis tersebut sama atau kompatibel dan dengan demikian, di antara hal-hal lainnya, memungkinkan untuk mengetik bebek yang diperiksa.
Sekarang saya pikir saya mengerti sebagian besar keuntungan dari sistem tipe struktural tapi saya bertanya-tanya apakah itu tidak akan membatalkan keselamatan tipe dari contoh-contoh seperti berikut ini
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
Apakah pemahaman saya benar bahwa dalam sistem tipe struktural, baris terakhir akan dikompilasi juga dan jika demikian, bukankah ini akan menjadi kerugian sehubungan dengan keamanan jenis?