Java 泛型 - 限制 child class object 存储在 parent class 参数中

Java generics - restrict child class object stored in parent class argument

我有 类 Parent 和(Child 扩展 Parent)。 我还有 类 A 和(B 扩展 A)。

设置以下代码:

class Parent {
  method (A a) {
    //some actions
  }
}

class Child extends Parent {
 method (B b) {
   super.method(b)
   // some additional actions
 }
}

假设我们有以下内容:

Parent p = new Parent();
Child c = new Child();
A a = new A();
B b = new B();

要求如下:

p.method(a); // success
p.method(b); //RunTimeException

c.method(a); //RunTimeException
c.method(b); //success

这里的主要问题是 c.method(a) 和 p.method(b) 成功运行。

是否可以使用泛型实现此行为? 任何建议表示赞赏。

谢谢。

你总是可以随心所欲地抛出 RuntimeExceptions,但你不应该,你很可能想要一个编译器错误!?然后问题是:为什么? ChildParent,您可以对父级调用的所有内容也应该对子级有效,请参阅 SOLID 中的 L。

您可以通过使用

class Parent<T> { 
    void method (T t) { ... }
}

class Child<T> extends Parent<T> {
    void somethingElse () { ... }
}

然后

Parent<A> p = new Parent<>();
Child<B> c = new Child<>();
A a = new A();
B b = new B();

p.method(a); // works
p.method(b); // compiler error

c.method(a); // compiler error
c.method(b); // works

但在那一点上,Child<B>Parent<A> 相比是完全不同的,并且以前可以使用的 Parent p = c; 不再有效/可用。