2010-04-20 33 views
7

Tôi đang tìm hiểu về các kiểu tĩnh và động, và tôi đến mức hiểu được phần lớn, nhưng trường hợp này vẫn giúp tôi.Kiểu động và kiểu động so với kiểu tĩnh trong Java

Nếu lớp B kéo dài A, và tôi có:

A x = new B(); 

như sau cho phép ?:

B y = x; 

Hoặc là đúc rõ ràng cần ?:

B y = (B) x; 

Cảm ơn!

Trả lời

15

Truyền rõ ràng là yêu cầu và sẽ thành công.

Lý do tại sao nó là bắt buộc bởi vì nó không luôn luôn thành công: biến được khai báo là A x có thể tham chiếu đến các trường hợp không phải là instanceof B.

// Type mismatch: cannot convert from Object to String 
Object o = "Ha!"; 
String s = o; // DOESN'T COMPILE 

// Compiles fine, cast succeeds at run-time 
Object o = "Ha!"; 
String s = (String) o; 

// Compiles fine, throws ClassCastException at run-time 
Object o = Boolean.FALSE; 
String s = (String) o; 

hay không một dàn diễn viên được yêu cầu được xác định chỉ bởi các loại tuyên bố của các biến có liên quan, KHÔNG bởi các loại của các đối tượng mà họ đang đề cập đến tại thời gian chạy. Điều này đúng ngay cả khi các tham chiếu có thể được giải quyết tại thời gian biên dịch.

final Object o = "Ha!"; 
String s = o; // STILL doesn't compile!!! 

Ở đây, mặc dù final biến o sẽ luôn luôn đề cập đến một instanceof String, gõ tuyên bố của nó vẫn còn là Object, và do đó một rõ ràng (String) cast là vẫn cần thiết để biên dịch.

+0

Cảm ơn một nhóm. Tôi hoàn toàn hiểu ngay bây giờ. – XpdX

+1

@XpdX: thì bạn nên chấp nhận điều này làm câu trả lời đúng. –

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