2017-08-26 10 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; 
    } 
} 

アップキャスト車両に(?)、車や自転車を試してみることです。この種のジェネリッククラスの型でも可能ですか?鋳造することを

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

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

注:

+0

全体の理由は、あなたがキャストする必要はありませんんです。キャスティングが間違っているとわかったら –

答えて

1

あなたが望むものを行うためには、あなたが明示的にキャスト

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

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

を変更する必要は次のように(Vehicle) myObjectによって行うことができますオブジェクトはに変更されません。それはそれに対する視界を減らすだけです。プログラマがモジュール性を高め、論理的なバグやエラーの検出を容易にするためのツールです。

Garage<Vehicle> garage = new Garage<>(); 
garage.add(new Car()); 
garage.add(new Bike()); 
Garage<Vehicle>はタイプVehicleのあるすべてのものを受け入れることができるたとえば

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" 

あなたは常にオブジェクトの正確な型を印刷したgetClass()を使用して自分自身を納得させることができます

ここで明示的にキャストする必要はありません。両方とも型がVehicleであるため追加できます。これは、instanceof演算子myCar instanceof Vehicleのように、ブール値trueに解決されます。 だけCar sおよびないBike秒を受け入れますが

:ジェネリックを使用するための

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

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

ありがとう。通常、思ったよりも簡単でした。 –

+0

@NathanHughes修正済みです。 – Zabuza

関連する問題