2012-07-02 50 views
20

Giả sử, chúng ta có:Làm thế nào để `isInstanceOf` hoạt động?

class B 
class A extends B 
trait T 

Sau đó, nó giữ:

val a: A with T = new A with T 
a.isInstanceOf[B] // result is true ! 

Có quyền nói, isInstanceOf phương pháp kiểm tra, nếu có ít nhất một loại (không phải tất cả các loại) mà phù hợp phía bên tay phải trong mối quan hệ loại phụ?

Tại cái nhìn đầu tiên, tôi nghĩ rằng một giá trị với loại A with T không thể là một subtype của B, vì AT là không phải cả hai phân nhóm của B. Nhưng đó là AhoặcT là loại phụ của B - có đúng không?

+4

Vâng, đúng vậy. – Nicolas

+0

Dưới đây là tổng quan nhanh về bình đẳng đối tượng http://joelabrahamsson.com/learning-scala-part-eight-scalas-type-hierarchy-and-object-equality/ – Jaider

Trả lời

30

isInstanceOf xem có mục nhập tương ứng trong chuỗi kế thừa hay không. Chuỗi A with T bao gồm A, BT, vì vậy a.isInstanceOf[B] phải đúng.

chỉnh sửa:

Thực ra mã byte được tạo ra gọi Javas instanceof, vì vậy nó sẽ là a instanceof B trong java. Một cuộc gọi phức tạp hơn một chút như a.isInstanceOf[A with T] sẽ là (a instanceof A) && (a instanceof T).

+1

Cảm ơn bạn đã cung cấp thông tin cơ bản, đã giúp ích rất nhiều.Bạn có biết nơi tôi có thể tìm thêm thông tin cơ bản về phương pháp 'isInstanceOf' của Scala không? API Scala không nói nhiều về nó. –

+0

Không có gì nhiều để kể. Nó chỉ là 'instanceof'. – drexin

10

Tại cái nhìn đầu tiên, tôi nghĩ rằng một giá trị với loại A với T không thể là một kiểu phụ của B

Có hai quan niệm sai lầm ở đây. Đầu tiên, kiểu tĩnh của một cá thể có bất kỳ kết quả nào trên kết quả của isInstanceOf: không có. Để rõ ràng, khi thực hiện a.isInstanceOf[B], thực tế là a là loại A with Tkhông liên quan.

Phương thức isInstanceOf được triển khai ở cấp bytecode bởi JVM. Nó xem thông tin lớp học mỗi trường hợp mang và kiểm tra xem B một trong các lớp (lớp của cá thể và tổ tiên của nó) hay một trong các giao diện được triển khai. Đó là mối quan hệ "là-a": "a là chữ B".

Về mặt kỹ thuật, isInstanceOf là một phần của phản ánh của Java, nơi được gọi là instanceof.

Quan niệm sai lầm thứ hai là thừa kế bằng cách nào đó có thể xóa loại cấp độ gốc. Điều đó không bao giờ xảy ra: thừa kế chỉ thêm các loại, không bao giờ loại bỏ chúng. Loại A with T là một số A, một số B, một số T, một số AnyValAny. Vì vậy, ngay cả khi isInstanceOf đã xem xét loại A with T, nó vẫn sẽ trở lại đúng sự thật.

+0

Bạn có biết làm thế nào tôi có thể chứng minh 'Null' và' Nothing' là loại phụ của tất cả mọi thứ trong REPL? '" A ".isInstanceOf [Null]' lỗi? cũng như 'Không có gì'? Tôi đoán nó có lý; tức là ''' 'instanceof null' sẽ không hoạt động trong Java. Tôi có phải lấy từ tài liệu cho nó không ?! – Toby

+0

@Toby 'Nothing' không tồn tại trong Java, vì nó xử lý các lớp và nguyên thủy và những thứ khác biệt, và' instanceof' chỉ liên quan đến cái cũ. Ngoài ra, 'Null' không tồn tại trong Java, mà không có khái niệm" đáy ". –

Các vấn đề liên quan