オーバーロードされたメソッドの曖昧さを Scala で明示的に解決するには?
Java のライブラリに用意されているオーバーロードされたメソッドを Scala で利用しようとしています。
class X{
public <E> void f(E... values){ System.out.println(1); }
public void f(Object value){ System.out.println(2); }
}
しかし Scala ではパラメータの型に互換性がある場合、オーバーロードされたメソッドのどれを使って良いか解決することができずコンパイルエラーが発生します。
val x = new X()
x.f("foo")
error: ambiguous reference to overloaded definition,
both method f in class X of type (value: Any)Unit
and method f in class X of type [E](values: E*)Unit
match argument types (String)
呼び出し時のパラメータ部分を "foo":Object
や "foo".asInstanceOf[Object]
などにしても状況に変化はありません。回避策としてリフレクションを使用することはできます。
classOf[X].getMethod("f", classOf[Object]).invoke(x, "foo") // => 2
根本的に、Scala で 2. 側のメソッドを明示的に呼び出すにはどうすれば良いでしょうか?
Java 11.0.2 / Scala 2.12.8