ผมเคยดูเพียงแค่การพูดคุยนี้โดยแดเนียล Spiewakที่เขาพูดเกี่ยวกับข้อดีของการพิมพ์โครงสร้างเมื่อเทียบกับสกาล่าของ ans ของ Java พิมพ์เล็กน้อย ตัวอย่างหนึ่งสำหรับความแตกต่างนี้จะเป็นรหัส Java ต่อไปนี้
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
ซึ่งแน่นอนว่าจะไม่รวบรวมเพราะความเข้ากันได้ระหว่างประเภทFoo
และBar
จะถูกกำหนดโดยชื่อ
ระบบประเภทโครงสร้างในอีกด้านหนึ่งสามารถประกาศว่าทั้งสองประเภทมีความเท่าเทียมกันหรือเข้ากันได้และดังนั้นในกรณีอื่น ๆ อนุญาตให้มีการตรวจสอบการพิมพ์เป็ด
ตอนนี้ฉันคิดว่าฉันเข้าใจถึงข้อดีของระบบโครงสร้างแบบส่วนใหญ่แล้ว แต่ฉันสงสัยว่ามันจะไม่ทำให้ความปลอดภัยของประเภทจากตัวอย่างเช่นต่อไปนี้เป็นโมฆะ
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
ความเข้าใจของฉันถูกต้องหรือไม่ที่ระบบประเภทโครงสร้างบรรทัดสุดท้ายจะรวบรวมเช่นกันและหากเป็นเช่นนั้นนี่จะไม่เป็นข้อเสียสำหรับความปลอดภัยของประเภทหรือไม่?