我有以下示例:
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
A<ConcreteErrorHandler> a = new A<ConcreteErrorHandler>();
a.m(); //Exception here!
}
public static class AbstractErrorHandler {
public static void handle(){
throw new UnsupportedOperationException("Not implemented");
}
}
public static class ConcreteErrorHandler extends AbstractErrorHandler{
public static void handle(){
System.out.println("Concrete handler");
}
}
public static class A<T extends AbstractErrorHandler>{
public void m(){
T.handle();
}
}
}
为什么调用基类的方法而不调用派生类的方法?这些handle()
方法的签名完全相同。我知道静态方法不会继承,但是我的情况下不应该抛出编译时错误吗?
有人可以解释这种行为吗?
这样做的原因是编译器不知道在运行时AbstractErrorHandler
将替换哪个确切的子类型T
。这就是为什么它只是将方法调用绑定T.handle()
到AbstractErrorHandler.handle()
方法。
这里的问题是您将继承与static
Java中类的功能混合在一起。
为了使其正常工作,您必须摆脱方法的static
修饰符,.handle()
并T
在A
类中保留一个实例。该T
实例(在运行时)将是的某些特定子类,AbstractErrorHandler
然后将执行实际 .handle()
方法。
例如:
class Ideone {
public static void main(String[] args) throws java.lang.Exception {
A<ConcreteErrorHandler> a = new A<ConcreteErrorHandler>(new ConcreteErrorHandler());
a.m();
}
public static class AbstractErrorHandler {
public void handle() {
throw new UnsupportedOperationException("Not implemented");
}
}
public static class ConcreteErrorHandler extends AbstractErrorHandler {
public void handle() {
System.out.println("Concrete handler");
}
}
public static class A<T extends AbstractErrorHandler> {
T instance;
A(T instance) {
this.instance = instance;
}
public void m() {
instance.handle();
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句