2017-08-26 138 views
0

我的選擇是什麼,如果我下面的代碼工作?Java類的泛型

class Garage<X>{} 

class Vehicle {} 

class Car extends Vehicle {} 

class Bike extends Vehicle {} 

class A { 
    public static void main(String[] args) { 
     Garage<Car> car = new Garage<>(); 
     Garage<Bike> bike = new Garage<>(); 
     Garage<Vehicle> vehicle = new Garage<>(); 
     //what are the options to do this? 
     vehicle=car; 
     vehicle=bike; 
    } 
} 

我後是嘗試上溯造型(?)汽車和自行車車輛。這種類型的泛型類型甚至可能嗎?

+0

整個之所以使用泛型是你沒有投。如果你發現自己在鑄造你做錯了 –

回答

1

爲了做到你想要什麼,你需要改變

Garage<Vehicle> vehicle = new Garage<>(); 

Garage<? extends Vehicle> vehicle = new Garage<>(); 
-1

明確鑄造可以通過(Vehicle) myObject來完成,如:

Car car = new Car(); 
Vehicle carAsVehicle = (Vehicle) car; 

Bike bike = new Bike(); 
Vehicle bikeAsVehicle = (Vehicle) bike; 

注意,鑄造不會改變的對象。它只會減少對它的看法。它是程序員增加模塊性並減少邏輯錯誤和錯誤檢測的工具。

您可以通過使用getClass()總是打印對象的確切類型說服自己:

Car car = new Car(); 
System.out.println(car.getClass()); 
// Prints something like "Car" 

Vehicle carAsVehicle = (Vehicle) car; 
System.out.println(carAsVehicle.getClass()); 
// Prints the same and not "Vehicle" 

例如一個Garage<Vehicle>可以接受一切是Vehicle類型:

Garage<Vehicle> garage = new Garage<>(); 
garage.add(new Car()); 
garage.add(new Bike()); 

這裏不需要明確演員,都可以添加,因爲兩者都是Vehicle。您可以使用instanceof運算符(如myCar instanceof Vehicle)來檢查它,該運算符將解析爲布爾值true

雖然將只接受Car秒且不Bike S:

Garage<Car> carOnlyGarage = new Garage<>(); 
carOnlyGarage.add(new Car()); 

carOnlyGarage.add(new Bike()); // Compiler error! 
+0

謝謝。通常情況下,這比我想象的要容易。 –

+0

@NathanHughes修正了它。 – Zabuza