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