【问题标题】:Is it possible to override a generisized function?是否可以覆盖泛型函数?
【发布时间】:2009-10-30 18:07:30
【问题描述】:

是否可以覆盖下面代码 sn-p 中所示的泛型函数?

interface A {
}

interface B extends A {
}


abstract class C {
    protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
    @Override
protected void abc(B xyz) {
    // doesn't compile
    // The method abc(B) of type D must override or implement a supertype method
    }
}

谢谢

【问题讨论】:

  • 你的意思是一个通用函数?我不喜欢这种“通用化”的时尚。

标签: java generics inheritance


【解决方案1】:

使用您的代码,D 的实例是 C 的实例,因此必须接受 A 的 any 子类作为其 abc() 方法的参数。你想要的是一个只接受特定子类的实例。您需要生成C(而不仅仅是C#abc())。然后你可以让D扩展C&lt;B&gt;,像这样:

interface A {
}

interface B extends A {
}

abstract class C<T extends A> {
    protected abstract void abc(T xyz);
}

class D extends C<B> {
    @Override
    protected void abc(B xyz) {
        // Compiles
    }
}

证明你不能只泛化方法:

interface A {
}

interface B extends A {
    public void def();
}

abstract class C {
    protected abstract <T extends A> void abc(T xyz);
}

class D extends C {
    @Override
    protected void abc(B xyz) {
        xyz.def();
    }

    public static void main(String[] args) {
        D d = new D();
        d.abc(new B(){}); // Invokes def() on a B, OK
        C c = (C) d;      // Cast to a C, OK
        c.abc(new A(){}); // C#abc() applies to an A, but tries to invoke
                          // a's def(), which it lacks
    }
}

【讨论】:

  • 好的,谢谢。但是,如果您真的只想泛化 C#abc,而不是 C,该怎么办?
  • 我已经编辑了原始答案以添加一些代码来说明为什么您不能泛化该方法。
【解决方案2】:

您的课程 D 应该扩展 C&lt;B&gt;

【讨论】:

  • 那行不通,因为它是泛型函数 abc 而不是 C 类。
猜你喜欢
  • 2021-05-21
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
相关资源
最近更新 更多