java - 从 Scala 调用名为 "clone"的 Java 方法

标签 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:

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

有什么想法吗? 谢谢。

最佳答案

首先看Object#clone() signature

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/

相关文章:

android - 使用 minSdkVersion 之外的 API 级别的属性

java - 编写一个计算零的递归函数

java - 词干提取和词形还原中未涵盖的 Word 基本形式

java - 向群组发送消息(通知) - Android

java - 如何使用 DeepLearning4J 训练 RBM 和重建输入?

javascript - 从查询中清除以前的结果

javascript - youtube api v3 插入评论

scala - 尝试在给定的 ExecutionContext 中执行 Scala WS 调用

scala - Akka websocket - 如何通过服务器关闭连接?

json - 在Scala中解析JSON的最直接方法是什么?