【发布时间】:2019-01-17 10:19:05
【问题描述】:
我在我的 Scala 中使用了一个 Java 类,它生成 ambiguous reference to overloaded definition。这是解释这个问题的代码。
IComponent.java
package javascalainterop;
import java.util.Map;
public interface IComponent {
public void callme(Map<String, Object> inputMap);
}
AComponent.java
package javascalainterop;
import java.util.Map;
public class AComponent implements IComponent {
String message;
public AComponent(String message) {
this.message = message;
}
@Override
public void callme(Map inputMap) {
System.out.println("Called AComponent.callme with " + message);
}
}
BComponent.scala
package javascalainterop
import java.util.{Map => JMap}
class BComponent(inputMessage: String) extends AComponent(inputMessage) {
override def callme(inputMap: JMap[_, _]) {
println(s"Called BComponent.callme with $inputMessage")
}
}
ComponentUser.scala
package javascalainterop
import java.util.{HashMap => JHashMap}
object ComponentUser extends App {
val bComponent = new BComponent("testmessage")
val javaMap = new JHashMap[String, AnyRef]
bComponent.callme(javaMap)
}
当我尝试编译 BComponent.scala 和 ComponentUser.scala 时,编译失败并显示以下消息。
javascalainterop/ComponentUser.scala:8: error: ambiguous reference to overloaded definition,
both method callme in class BComponent of type (inputMap: java.util.Map[_, _])Unit
and method callme in trait IComponent of type (x$1: java.util.Map[String,Object])Unit
match argument types (java.util.HashMap[String,AnyRef])
bComponent.callme(javaMap)
^
one error found
Java 类代表一个我无法控制的库。我考虑过使用反射,但它并不能很好地服务于用例。 super[AComponent].callme 也不能解决问题。如何解决这种情况,以便代码编译并在运行时调用AComponent.callme?
【问题讨论】:
标签: java scala reflection scala-generics