假设以下现有类:
class A {
public void foo() { ... };
...
}
class A1 extends A { ... };
class A2 extends A { ... };
...
class A1000 extends A { ... };
现在,我们需要创建一个覆盖“foo”方法的每个Axx类的变体。基本想法是:
class B<T extends A> extends T {
@Override public void foo () { ... };
}
但似乎无法从一个参数类型中扩展一个类。
目标是不需要遵循新代码:
class B1 extends A1 { @Override public void foo() { ... }; };
class B2 extends A2 { @Override public void foo() { ... }; };
....
class B1000 extends A1000 { @Override public void foo() { ... }; };
并允许声明如下:
...
B<A643> b643 = new B<A643>;
b643.foo();
...
任何提示?
非常感谢。
答案 0 :(得分:5)
A
不是通用的。我想你想要的东西,
class B<T> extends A {
@Override public void foo () { ... };
}
这是扩展B
的{{1}}通用类型A
意味着T extends A
采用扩展B
的类型(不是{{1} }} extends A
)。
答案 1 :(得分:1)
您可以将继承与委托混合使用。我认为它很难看,但它应该有效。
class UniversalB extends A{
A a;
UniversalB(A a) {
this.a = a;
}
@Override public void foo() { ... };
// @Override any other method from A you want/need
// and delegate it to the passed member if necessary
}
UniversalB b = new UniversalB(new A123());
b.foo();
b.anyMethodInA();
答案 2 :(得分:0)
最后,使用代理类解决了。标准的reflection.proxy不适用,但是图书管理员CGLib的代理却没有。简而言之,使用具有与“B.foo”相同的代码的拦截器。有关详细信息,请参阅reflection.proxy not valid when override。感谢Tagir Valeev的帮助。