我最近遇到了一个有趣的问题:我希望泛型类中的方法只只接受指定泛型类型的内部类的实例。目标,如以下示例所示,是 CarInspector<CarBrand1>
只能检查CarBrand1
制造的驱动轮,同时保持DrivingWheel
CarMaker
的内部类.理由是我不想要 DrivingWheel
在封闭的 CarMaker
之外定义子类。
这是我解决问题的第一种方法:
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>
可能更明智;尽管如此,它仍然是一个有趣的切线,并且它是我正在考虑的针对我所从事的特定领域的设计替代方案。
最佳答案
你需要使用更多的泛型。更改基础 DrivingWheel
类以添加指定汽车品牌的通用参数:
public class CarInspector<T extends CarMaker> {
public void inspect(DrivingWheel<T> arg) {}
}
关于java - 您如何强制将泛型包含在特定类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48830637/