0

看看这堂课

abstract class LolCat<T> {
    T execute() throws Err, Arr {
        T lol = doSomething();
        if (lol == null)
            lol = doSomething();

        return lol;
     }

    abstract T doSomething();
    abstract T doSomething() throws Err, Arr;
}

现在我们在某处的任何方法中都有一个匿名实现,像这样的 LolCat

final UhmLetsSayCat cat = new ImplLolCat<UhmLetsSayCat>() {
    @Override
    UhmLetsSayCat doSomething() {
        return null; // somehow a UhmLetsSayCat is returned for real sometimes null
    }

    @Override
    UhmLetsSayCat doSomething() throws Err,Arr {
        return null; // really it does right thing, whatever
    }
 }.execute();

现在我的问题是,为什么对 doSomething() 的第一次调用会转到不抛出 Err、Arr 的方法,但第二次调用(如果 lol 为空)会运行抛出 Err、Arr 的 doSomething 实现。如何区分要运行的方法!?

编辑:假警报。我的天啊。我一定是整个晚上都瞎了,doSomething实际上不是同一个方法名称,它们分别称为queryAll和QuerryAl1,我会找到这样做的人并打他。

EDIT2:谢谢大家。

4

2 回答 2

6

您不能在一个类中声明两个具有相同签名的方法。子句、throws注释和返回类型不计算在内。

abstract T doSomething();
abstract T doSomething() throws Err, Arr; // won't compile

如果编译成功,则您的编译器中存在错误。

于 2012-09-05T15:16:53.190 回答
1

你甚至不应该编译这个例子(错误:重复方法doSomething()

于 2012-09-05T15:18:30.627 回答