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 をスローしないメソッドに行くのに、loll が null の場合、2 番目の呼び出しが Err、Arr をスローする doSomething 実装を実行するのはなぜですか。どのメソッドを実行するかは、どのように区別されるのでしょうか!?

編集:誤警報。ああ、神様。私は一晩中盲目だったに違いありません.doSomethingは実際には同じメソッド名ではありません.queryAllとQuerryAl1と呼ばれていました.私はそれをした男を見つけて彼を叩きます.

EDIT2:みんなありがとう。

4

2 に答える 2

6

クラスで宣言された同じシグネチャを持つ 2 つのメソッドを持つことはできません。句、注釈、および戻り値の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 に答える