Unerwartetes Verhalten bei überladenen Methoden

Ich bin ein bisschen verwirrt über Groovys Methodenüberlastungsverhalten: Angesichts der Klasse und der Tests unten bin ich ziemlich einverstandentestAStringNull undtestBStringNull Ausnahmen für mehrdeutige Methodenaufrufe auslösen, aber warum ist das nicht der Fall?testANull undtestBNull dann?

Und noch viel wichtiger: Warum?testBNull(null) AnrufString foo(A arg)? Ich vermute, das Objekt weiß nichts über den Typ der Variablen, an die es gebunden ist, aber warum ist dieser Aufruf für Groovy nicht mehrdeutig, während die anderen es sind?

(Ich hoffe, ich habe es gut genug erklärt, mein Kopf schmerzt, weil ich dieses minimale Beispiel erzeugt habe.)

class Foo {
    static class A {}
    static class B {}

    String foo(A arg) { return 'a' }

    String foo(String s, A a) { return 'a' }

    String foo(B arg) { return 'b' }

    String foo(String s, B b) { return 'b' }
}

Tests:

import org.junit.Test
import Foo.A
import Foo.B

class FooTest {
    Foo foo = new Foo()

    @Test
    void testA() {
        A a = new A()
        assert foo.foo(a) == 'a'
    }

    @Test
    void testAString() {
        A a = new A()
        assert foo.foo('foo', a) == 'a'
    }

    @Test()
    void testANull() {
        A a = null
        assert foo.foo(a) == 'a'
    }

    @Test
    void testAStringNull() {
        A a = null
        assert foo.foo('foo', a) == 'a'
    }

    @Test
    void testB() {
        B b = new B()
        assert foo.foo(b) == 'b'
    }

    @Test
    void testBString() {
        B b = new B()
        assert foo.foo('foo', b) == 'b'
    }

    @Test
    void testBNull() {
        B b = null
        assert foo.foo(b) == 'b'
    }

    @Test
    void testBStringNull() {
        B b = null
        assert foo.foo('foo', b) == 'b'
    }

}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage