我想使用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:
错误:无法在Option [JavaAPI]中访问类Object中的方法clone 由于前缀类型,不允许访问受保护的方法克隆 选项[JavaAPI]不符合包a.b.c中访问的类D 发生
有什么想法吗? 感谢。
答案 0 :(得分:2)
protected Object clone()
throws CloneNotSupportedException
您想要覆盖此方法。
在您的示例中,您现在有两种方法:
protected Object clone()
throws CloneNotSupportedException
public JustSomeAPISpecificType clone()
请参阅:
JustSomeAPISpecificType.java
public enum JustSomeAPISpecificType{
INSTANCE
}
Factory.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
<强>更新强> 如果你施放 - 你会看到方法克隆(如果工厂是公共的)。
scala> api.asInstanceOf[Factory.JavaApiImpl].clone
res4: JustSomeAPISpecificType = INSTANCE