在一個項目中,我有一個服務和一個使用該服務的類。在這個例子中,車輛將使用維修服務。維修服務只能修理某種類型的車輛:車庫只能修理汽車。我需要在車輛上使用適用的服務修理它,repairUsingService(..)
。使用泛型時避免投射
我的目標是有一個乾淨的Vehicle
基類和清潔RepairService
實現。我試圖設計維修服務的repair
方法有兩種方法:
repair(Vehicle<T> vehicle)
:這是醜陋的,因爲實現需要做repair(Vehicle<Car> car)
,但很顯然,汽車是車輛。repairSimple(T vehicle)
:是與漂亮的,但不能從Vehicle
類叫做沒有一個醜陋的演員。
有沒有辦法避免鑄造,但仍只使用泛型參數類型(repairSimple(T)
等)T
?
public class Vehicle<T extends Vehicle<T>> {
public void repairUsingService(RepairService<T> obj) {
obj.repair(this);
obj.repairSimple((T) this);
}
}
public class Car extends Vehicle<Car> {
}
public interface RepairService<T extends Vehicle<T>> {
void repair(Vehicle<T> vehicle);
void repairSimple(T vehicle);
}
public class Garage implements RepairService<Car> {
@Override
public void repair(Vehicle<Car> car) {
System.out.println("Car repaired.");
}
@Override
public void repairSimple(Car car) {
System.out.println("Car repaired.");
}
}
是否有真正的原因,因爲'class Vehicle>'因此'class Car extend Vehicle ''而不是'class Car extend Vehicle'? –
2015-02-08 12:00:39
不能僅僅使用基類來做一些事情,然後在實現類中重寫它呢? – engineercoding 2015-02-08 12:23:36
@MikeNakis它用於像'repairUsingService(RepairService)'這樣的方法和變量,它需要車輛的通用類型。或者是否有避免這種情況的好方法? –
Frithjof
2015-02-08 12:25:20