2011-11-22 33 views
5

Ai đó có thể giải thích những gì đang xảy ra ở đây?java casting với tham chiếu superclass

Giả sử CarBike là các lớp con của Vehicle.

Dường như với tôi như tham chiếu Vehicle v được truyền tới số Bike. Tôi biết điều này là bất hợp pháp và thực sự trình biên dịch phun ra ... Car cannot be cast to Bike.

Nhưng điều này không nên là Vehicle không thể truyền tới Bike? Xét cho cùng, Vehicle v là tham chiếu Vehicle.

public class Test { 
    public static void main(String[] args) { 
     Vehicle v = new Car(); 
     Bike b = (Bike) v; 
     // some stuff 
    } 
} 
+1

Bởi vì JVM biết rằng đó là một chiếc xe khi nó được ném ngoại lệ. –

+0

Trình biên dịch không tách ra ngoại lệ. Mã này ném một ** thời gian chạy ** 'ClassCastException'. –

+0

@Pregnant mẹ, xin vui lòng chấp nhận một câu trả lời nếu bạn có hài lòng với bất kỳ của họ. – Reddy

Trả lời

3

Thông báo lỗi cho biết Car vì đây là ngoại lệ thời gian chạy. Kể từ thời điểm này nó biết được trường hợp thực tế (Ô tô, Xe đạp, hoặc Xe) mà tham chiếu Xe đang trỏ đến, nó cung cấp thông báo lỗi cụ thể hơn.

Nếu đây là một ngoại lệ tại thời gian biên dịch, trình biên dịch sẽ đề cập đến Vehicle vì trình biên dịch có thể không biết ví dụ thực tế mà tham chiếu xe trỏ đến.

+0

Làm cho tinh thần! cảm ơn. – m0therway

1

Thực tế là Car đang được truyền. v thuộc loại Vehicle do đó việc gán Vehicle v = new Car(); hoạt động từ CarVehicle.

Đối tượng v giữ nguyên nhận dạng của nó; đó là Car. Vì vậy, dàn diễn viên bất hợp pháp là từ Car đến Bike.

0

Dòng

Bike b = (Bike) v; 

sẽ là hợp pháp nếu, chẳng hạn, v là một trong qua-Vehicle. Vì vậy, tôi đoán rằng việc xác thực này đang diễn ra trong quá trình tối ưu hóa. Trình biên dịch muốn tối ưu hóa công việc bình thường khi truyền nếu có thể - thậm chí có thể tối ưu hóa hoàn toàn b - và tất nhiên là có thể nếu v được tạo thành Bike trên dòng trước thay vì Car.

+0

Chỉ để được pedantic, dòng đó là hợp lệ khi và chỉ khi v là một đối tượng Bike (hoặc thể hiện của một phân lớp) bất kể nơi mà các đối tượng v đến từ. –

0

A (bán) đồng bằng tiếng anh trả lời:

A Car không thể đột nhiên "trở thành" một Bike hay bị đối xử như một chiếc xe đạp, bởi vì một Bike sẽ có đặc tính khác nhau (biến) mô tả nó, và khác nhau cách để tương tác với nó (phương pháp).

Tuy nhiên, chúng là cả hai phương tiện, vì vậy chúng sẽ có một số điểm chung, chẳng hạn như có lẽ, khả năng lái, rẽ trái hoặc phải hoặc thay đổi bánh răng.

Điều này làm cho nó đơn giản khi bạn có logic như thế này:

ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>(); 
vehicles.add(new Bike()); 
vehicles.add(new Car()); 
vehicles.add(new Bike()); 

//Some other crazy code 

for(Vehicle v : vehicles) { 
    v.applyBrakes(); 
    v.changeDownGear(); 
    v.turnRight(); 
} 

mỗi lớp con của xe (xe đạp, xe hơi, Segway vv) sẽ phải thực hiện riêng của họ về các phương pháp và xử lý bản thân một cách thích hợp

0

Nếu không có mã nguồn, nó không thể dứt khoát nói những gì hợp pháp và những gì không.Tuy nhiên, nó an toàn để giả định rằng cây thừa kế cho các lớp này trông giống như

Vehicle 
     | 
    __________ 
    |   | 
Car  Bike 

như vậy mà CarBike là lớp con của Vehicle có nghĩa là Vehicle là một sự tổng quát của CarBike. Trong Java, bạn có thể truyền một thể hiện của một lớp con vào lớp cơ sở của nó. Vì vậy, trong trường hợp này, bạn có thể sử dụng Car cho một chiếc xe và xử lý nó giống như bạn thực sự có một thể hiện của đối tượng Vehicle. Điều này cũng đúng với một số Bike. Tuy nhiên, vì Car không phải là một lớp con của Bike bạn không thể truyền từ một đến người khác. Tất cả CarsVehicles nhưng không phải tất cả VehiclesCars. Cũng không phải là họ Bikes. Và Car không bao giờ là Bike và ngược lại.

Bạn làm điều này để tạo mã có thể mở rộng hơn. Ví dụ bạn có thể viết mã để hiểu cách tương tác với mã sẽ được viết trong tương lai. Ví dụ về điều này sẽ là một số giao diện phổ biến, chẳng hạn như drive() cho phép các nhà phát triển khác cung cấp triển khai tùy chỉnh sau này. Mã của bạn mặc dù, bằng văn bản trước khi bàn tay vẫn có thể làm việc với nó bởi vì nó có thể xử lý các lớp con mới như thể chúng là trường hợp của lớp cơ sở.