调用类型变量的基本和派生静态方法

圣安东尼奥:

我有以下示例:

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()方法的签名完全相同。我知道静态方法不会继承,但是我的情况下不应该抛出编译时错误吗?

有人可以解释这种行为吗?

康斯坦丁·约夫科夫(Konstantin Yovkov):

这样做的原因是编译器不知道在运行时AbstractErrorHandler将替换哪个确切的子类型T这就是为什么它只是将方法调用绑定T.handle()AbstractErrorHandler.handle()方法。

这里的问题是您将继承与staticJava中类功能混合在一起

为了使其正常工作,您必须摆脱方法的static修饰符,.handle()TA类中保留一个实例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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章