java - 您如何强制将泛型包含在特定类中?

标签 java generics polymorphism generic-programming

我最近遇到了一个有趣的问题:我希望泛型类中的方法只接受指定泛型类型的内部类的实例。目标,如以下示例所示,是 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/

相关文章:

c# - 动态声明泛型类型实例

c# - 在 VB.NET/C# 中调用泛型函数

Java ArrayList不同的对象相互扩展,如何了解我检索到的对象?

c++ - 在继承中使用 delete 的意外行为,基指针对象指向最派生的类

Java:是否不鼓励 child 压倒 parent ?

python - 使用不同的类型和消息重新引发异常,保留现有信息

java - 为什么Java没有复制构造函数?

java - 如何在 Eclipse 之外构建 Eclipse 插件?

javascript - 在 Javascript 中修改 ArrayList 会导致 Camunda 中的序列化失败

java - 如何从 blobstore 中检索字节数组?