2017-08-26 124 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