您如何强制将泛型包含在特定的 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) {}
}