我想从 Scala 中使用以下 API 调用 Java 方法:
// Java API
public interface JavaAPI {
JustSomeAPISpecificType clone();
}
// Scala code in class a.b.c.D
val api: JavaAPI = factory.getAPI
val result: JustSomeAPISpecificType = api.clone
但是,这不起作用,因为 Scala 编译器(2.10)认为我想调用 Object.clone:
Error: method clone in class Object cannot be accessed in Option[JavaAPI] Access to protected method clone not permitted because prefix type Option[JavaAPI] does not conform to class D in package a.b.c where the access take place
有什么想法吗? 谢谢。
最佳答案
protected Object clone()
throws CloneNotSupportedException
您想要重写此方法。
在您的示例中,现在您有两种方法:
protected Object clone()
throws CloneNotSupportedException
public JustSomeAPISpecificType clone()
参见:
JustSomeAPISpecificType.java
public enum JustSomeAPISpecificType{
INSTANCE
}
工厂.java
public class Factory {
public static class JavaApiImpl implements JavaAPI{
public JustSomeAPISpecificType clone(){
return JustSomeAPISpecificType.INSTANCE;
}
}
public static JavaAPI getAPI(){
return new JavaApiImpl();
}
}
现在将您的文件添加到 src/main/java
并从 root 运行 sbt console
:
scala> val api = Factory.getAPI
api: JavaAPI = Factory$JavaApiImpl@4243eb68
scala> api.getClass.getMethods.filter(m => m.getName.startsWith("clone")).mkString("\n")
res0: String =
public JustSomeAPISpecificType Factory$JavaApiImpl.clone()
public java.lang.Object Factory$JavaApiImpl.clone() throws java.lang.CloneNotSupportedException
更新 如果你强制转换 - 你将看到方法克隆(如果工厂是公共(public)的)。
scala> api.asInstanceOf[Factory.JavaApiImpl].clone
res4: JustSomeAPISpecificType = INSTANCE
关于java - 从 Scala 调用名为 "clone"的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729827/