1

Groovy は、パラメーターの型がアルファベット順で最初になるメソッドを選択することで、あいまいなメソッド呼び出しを解決します。次の例では、Groovy が MyClass.printIt(null) を呼び出すと、型 "A" のパラメーターを受け取るメソッドが呼び出されます。

このコードをリファクタリングして、クラス A の名前をクラス C に変更すると、myVariable が null の呼び出しが、一番下のタイプ「B」のパラメーターを受け取るメソッドに解決されることがわかります。

    class MyTest {
      public static void main(String[] args) {
        B myVariable = new B()
        new MyClass().printIt(myVariable)
        myVariable = null
        new MyClass().printIt(myVariable)
      }
    }
    class A {}
    class B {}
    class MyClass {
      void printIt(A variable) {
        println "TOP method called"
      }
      void printIt(B variable) {
        println "BOTTOM method called"
      }
    }

上記のコードは、次の出力を生成します

呼び出された BOTTOM メソッド

TOPメソッドは それを呼び出し、型Bの変数を使用してtopメソッドを呼び出しました

クラス A の名前がクラス C に変更されると、出力は次のように変更されます。

呼び出された BOTTOM メソッド

呼び出された BOTTOM メソッド

好きなだけ順列を試してください。変数が他のクラスに型付けされていても、渡された変数がnullの場合、アルファベット順の名前が最も小さいクラスを取るメソッドが呼び出されます。

groovy --version Groovy バージョン: 2.0.5 JVM: 1.6.0_33 ベンダー: Sun Microsystems Inc. OS: Windows 7

私の質問は、Groovy がこれを行う理由です。これは設計によるものですか、それともバグですか?この動作はどこかに文書化されていますか?

デイブ

4

2 に答える 2

0

Groovy 2.1.6 ではこれを再現できません。これは Groovy 2.0.5 でも再現できません。どちらの使用例でも、出力は次のとおりです。

BOTTOM method called
TOP method called

A の名前を C に変更すると、出力は

BOTTOM method called
TOP method called

Gentoo Linux、JDK 1.7.0_25、

于 2013-09-20T20:48:02.183 に答える