私は groovys メソッドのオーバーロード動作について少し混乱しています: 以下のクラスとテストを考えると、あいまいなメソッド呼び出しの例外testAStringNull
をスローしても問題ありませんが、 and thentestBStringNull
の場合はそうではないのはなぜ
ですか?testANull
testBNull
そして、もっと重要なこと: なぜ をtestBNull(null)
呼び出すのString foo(A arg)
ですか? オブジェクトはそれがバインドされている変数の型を認識していないと思いますが、他の呼び出しが groovy であっても、その呼び出しがあいまいでないのはなぜですか?
(十分に説明したと思いますが、この最小限の例を生成するのに頭が痛いです。)
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' }
}
テスト:
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'
}
}