2015-01-03 17 views
5

nếu:Đúc trong Java (giao diện và lớp)

interface I{} 

class A implements I{} 

class B extends A{} 

class C extends B{} 

A a = new A(); 
B b = new B(); 

Why a = (B)(I)b; is correct 
but b = (B)(I)a; is false? 

tôi tìm casting để thể rất khó hiểu, cách tốt nhất để hiểu rằng nếu tôi có thể xuống được đúc hoặc lên đúc một đối tượng là gì?

+4

Tại sao các bạn đúc cho 'I' ở tất cả? Nếu bạn loại bỏ tất cả các đề cập đến 'I', và chỉ có' ​​a = (B) b; 'và' b = (B) a; 'sẽ rõ ràng với bạn? –

+0

@ JonSkeet đây là một câu hỏi thi java tôi cũng rất bối rối lý do tại sao họ đúc một giao diện "Tôi" – OPK

+0

Cả hai của những phôi là chính xác (như trong cả hai biên dịch và sẽ không thất bại trong thời gian chạy). Cụ thể bạn thấy gì khiến chúng không biên dịch trong Java 7+? – Makoto

Trả lời

1

hệ thống cấp bậc lớp học của bạn trông như thế này:

C -> B -> A -> I

Object x có thể được đúc vào lớp Y, nếu loại thời gian chạy của x là lớp con của Y. Hay nói cách khác, nếu có đường dẫn từ loại thời gian chạy là x đến Y. Theo "kiểu thời gian chạy", tôi có nghĩa là loại đối tượng (đối tượng được sử dụng khi xây dựng đối tượng) thay vì loại biến (một biến từ khai báo biến).

này có hiệu lực:

b = new B(); 
(B)(I)b; 

Object lưu trữ trong b có kiểu B. Nó được đúc thành I và sau đó quay lại B. B là một phân lớp của cả hai. Truyền tới I không thực sự làm bất cứ điều gì và có nghĩa là chỉ gây nhầm lẫn cho bạn.

Tuy nhiên, không ai trong số những người có giá trị:

a = new A(); 
(B)(I)a; 
(B)a; 

Cả hai đều sẽ thất bại với ngoại lệ: java.lang.ClassCastException: A cannot be cast to B. a có loại A không phải là phân lớp của B. Có một mối quan hệ giữa AB, nhưng nó theo chiều ngược lại - B là một phân lớp của A.

Đối với lời giải thích chi tiết hơn xem tại đây: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

1

Điều duy nhất liên quan đến việc trả lời các câu hỏi trong mẫu mã của bạn được như sau:

class B extends A{} 

Điều này có nghĩa rằng B là một lớp con của A. Các lớp con có thể được chuyển sang các kiểu siêu lớp, nhưng lớp siêu không thể được chuyển sang các kiểu lớp con.

Do đó, A không thể được đúc để gõ B.

Tại sao? Hãy suy nghĩ về logic theo cách này:

enter image description here là một loại Programming_language, nhưng Programming_language không phải là một loại enter image description here

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