您如何强制将泛型包含在特定的 class 中?
How can you enforce that a generic type is enclosed in a specific class?
我最近遇到了一个有趣的问题:我想要一个泛型中的方法-class 只接受指定泛型类型的内部 class 的实例 only。目标,如以下示例所示,是 CarInspector<CarBrand1>
只能检查由 CarBrand1
制造的驱动轮,同时保持 DrivingWheel
CarMaker
的内部 class .理由是我不希望 DrivingWheel
定义在封闭的 CarMaker
subclass 之外。
这是我解决问题的第一种方法:
public abstract class CarMaker {
public abstract class DrivingWheel {}
}
public class CarBrand1 extends CarMaker {
public class DrivingWheelByCarBrand1 extends DrivingWheel {}
private final DrivingWheelByCarBrand1 drivingWheel = new DrivingWheelByCarBrand1();
public DrivingWheelByCarBrand1 getDrivingWheel() {
return drivingWheel;
}
}
public class CarBrand2 extends CarMaker {
private class DrivingWheelByCarBrand2 extends DrivingWheel {}
private final DrivingWheelByCarBrand2 drivingWheel = new DrivingWheelByCarBrand2();
public DrivingWheelByCarBrand2 getDrivingWheel() {
return drivingWheel;
}
}
public class CarInspector<T extends CarMaker> {
public void inspect(T.DrivingWheel arg) {}
}
但是,下面的代码编译得很好:
CarBrand1 c1 = new CarBrand1();
CarBrand2 c2 = new CarBrand2();
CarInspector<CarBrand1> carInspector = new CarInspector<>();
carInspector.inspect(c1.getDrivingWheel());
carInspector.inspect(c2.getDrivingWheel());
有没有办法让编译器在 carInspector.inspect(c2.getDrivingWheel())
行中抛出错误或警告?
注意:除了这个问题之外,提议的设计可能不是最佳选择,而且将 DrivingWheel
定义为 DrivingWheel<T extends CarMaker>
可能更合适明智的;尽管如此,它仍然是一个有趣的切线,并且它是我正在考虑的针对我正在工作的特定领域的设计替代方案。
我已经能够通过将 class CarInspector
更改为:
来解决问题
public class CarInspector<T extends CarMaker, U extends CarMaker.DrivingWheel> {
public void inspect(U drivingWheel) {}
}
然后:
CarInspector<CarBrand1, DrivingWheelByCarBrand1> carInspector = new CarInspector<>();
还是不知道有没有更好的办法...
您需要使用更多泛型。更改基础 DrivingWheel
class 以添加指定汽车品牌的通用参数:
public class CarInspector<T extends CarMaker> {
public void inspect(DrivingWheel<T> arg) {}
}
我最近遇到了一个有趣的问题:我想要一个泛型中的方法-class 只接受指定泛型类型的内部 class 的实例 only。目标,如以下示例所示,是 CarInspector<CarBrand1>
只能检查由 CarBrand1
制造的驱动轮,同时保持 DrivingWheel
CarMaker
的内部 class .理由是我不希望 DrivingWheel
定义在封闭的 CarMaker
subclass 之外。
这是我解决问题的第一种方法:
public abstract class CarMaker {
public abstract class DrivingWheel {}
}
public class CarBrand1 extends CarMaker {
public class DrivingWheelByCarBrand1 extends DrivingWheel {}
private final DrivingWheelByCarBrand1 drivingWheel = new DrivingWheelByCarBrand1();
public DrivingWheelByCarBrand1 getDrivingWheel() {
return drivingWheel;
}
}
public class CarBrand2 extends CarMaker {
private class DrivingWheelByCarBrand2 extends DrivingWheel {}
private final DrivingWheelByCarBrand2 drivingWheel = new DrivingWheelByCarBrand2();
public DrivingWheelByCarBrand2 getDrivingWheel() {
return drivingWheel;
}
}
public class CarInspector<T extends CarMaker> {
public void inspect(T.DrivingWheel arg) {}
}
但是,下面的代码编译得很好:
CarBrand1 c1 = new CarBrand1();
CarBrand2 c2 = new CarBrand2();
CarInspector<CarBrand1> carInspector = new CarInspector<>();
carInspector.inspect(c1.getDrivingWheel());
carInspector.inspect(c2.getDrivingWheel());
有没有办法让编译器在 carInspector.inspect(c2.getDrivingWheel())
行中抛出错误或警告?
注意:除了这个问题之外,提议的设计可能不是最佳选择,而且将 DrivingWheel
定义为 DrivingWheel<T extends CarMaker>
可能更合适明智的;尽管如此,它仍然是一个有趣的切线,并且它是我正在考虑的针对我正在工作的特定领域的设计替代方案。
我已经能够通过将 class CarInspector
更改为:
public class CarInspector<T extends CarMaker, U extends CarMaker.DrivingWheel> {
public void inspect(U drivingWheel) {}
}
然后:
CarInspector<CarBrand1, DrivingWheelByCarBrand1> carInspector = new CarInspector<>();
还是不知道有没有更好的办法...
您需要使用更多泛型。更改基础 DrivingWheel
class 以添加指定汽车品牌的通用参数:
public class CarInspector<T extends CarMaker> {
public void inspect(DrivingWheel<T> arg) {}
}