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
,但你不应该,你很可能想要一个编译器错误!?然后问题是:为什么? Child
是 Parent
,您可以对父级调用的所有内容也应该对子级有效,请参阅 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;
不再有效/可用。
我有 类 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
,但你不应该,你很可能想要一个编译器错误!?然后问题是:为什么? Child
是 Parent
,您可以对父级调用的所有内容也应该对子级有效,请参阅 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;
不再有效/可用。