从Scala调用名为“clone”的Java方法

时间:2014-09-08 17:28:53

标签: java api scala clone

我想使用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   发生

有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:2)

首先请看Object#clone() signature

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