Проблема заключается в возвращаемом значении метода:
public static Motorized refuel(Motorized v)
Вы сказали, что у вас не было проблем с передачей Car
, и это полностью допустимое утверждение.Но вы не пытались вернуть значение из метода refuel
:
Car car = ...
Car refueled = refuel(car); // compiler error: Motorized is not assignable to Car!
Тип возвращаемого значения - Motorized
, хотя Car extends Motorized
, вы не можете быть уверены, что экземпляр Motorized
то, что возвращается, будет всегда быть Car
.Посмотрите этот упрощенный пример:
public static Motorized refuel(Motorized v) {
// try to refuel
// uh oh... the gas station exploded
// you have to change to a motorbike which just stands around
return new Motorbike();
}
Теперь вы можете ожидать Car
, но вы получите Motorbike
, поэтому даже сбой приведения:
Car refueled = (Car) refuel(car); // ClassCastException, Motorbike is not a Car
Вы можете сделать это схотя дженерики:
public static <M extends Motorized> M refuel(M m) {
// refuel the motorized vehicle
return m;
}
Хотя, если бензоколонка снова взрывается, у метода есть проблема.Он не знает, что на самом деле M
.Так что это может спасти вас от головной боли.