Comportamento inesperado com métodos sobrecarregados

Estou um pouco confuso sobre o comportamento de sobrecarga do método groovys: Dada a classe e os testes abaixo, estou muito bem comtestAStringNull etestBStringNull lançando exceções de chamadas de método ambíguas, mas por que não é esse o casotestANull etestBNull então?

E, muito mais importante: por quetestBNull(null) ligarString foo(A arg)? Eu acho que o objeto não sabe sobre o tipo de variável a que está vinculado, mas por que essa chamada não é ambígua para groovy enquanto os outros são?

(Espero ter explicado bem o suficiente, minha cabeça dói de gerar esse exemplo mínimo.)

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' }
}

Testes:

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'
    }

}

questionAnswers(1)

yourAnswerToTheQuestion