Tôi vừa xem bài nói chuyện này của Daniel Spiewak , nơi anh ấy nói về những lợi thế của việc gõ cấu trúc so với cách gõ danh nghĩa Java của Scala . Một ví dụ cho sự khác biệt này sẽ là mã Java sau
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
mà tất nhiên sẽ không biên dịch vì khả năng tương thích giữa Foo
và Bar
được xác định theo tên.
Mặt khác, một hệ thống kiểu cấu trúc có thể tuyên bố cả hai loại bằng nhau hoặc tương thích và do đó, trong số những thứ khác, cho phép kiểm tra gõ vịt.
Bây giờ tôi nghĩ rằng tôi đã hiểu hầu hết các ưu điểm của hệ thống kiểu kết cấu nhưng tôi tự hỏi liệu nó có làm mất hiệu lực an toàn kiểu từ các ví dụ như sau không
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
Sự hiểu biết của tôi có đúng không trong một hệ thống kiểu cấu trúc, dòng cuối cùng cũng sẽ biên dịch và nếu vậy, đây có phải là một bất lợi đối với an toàn kiểu không?