gpt4 book ai didi

scala - 如何使用多个可变参数方法在 Scala 中实现 Java 接口(interface)(类型橡皮擦问题)?

转载 作者:行者123 更新时间:2023-12-04 15:44:15 27 4
gpt4 key购买 nike

我有一个 Scala 类,它试图实现一个 Java 接口(interface)(JavaEE 7 中的 EntityManager 用于具体的单元测试目的)。该接口(interface)有这两种方法(除其他外):

public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses);
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings);

在 Scala 实现中,我有:
override def createStoredProcedureQuery(procedureName: String, resultClasses: Class[_]*): StoredProcedureQuery = ???
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ???

但是,我收到以下错误:
MyTest.scala:134: error: double definition:
method createStoredProcedureQuery:(procedureName: String, resultSetMappings: String*)javax.persistence.StoredProcedureQuery and
method createStoredProcedureQuery:(procedureName: String, resultClasses: Class[_]*)javax.persistence.StoredProcedureQuery at line 133
have same type after erasure: (procedureName: String, resultSetMappings: Seq)javax.persistence.StoredProcedureQuery
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ???

我一直无法想出一个解决办法。我的谷歌搜索也未能找到和回答。我正在使用 Scala 2.10.4。

最佳答案

AFAIK EntityManager Java 接口(interface)无法直接在 Scala 中实现。 Java varargs 在第一种方法中转换为 Seq[Class[_]],在第二种方法中转换为 Seq[String]。由于删除,两种方法都显示为具有相同的签名 createStoredProcedureQuery(String, Seq[_])

我只能为这个问题提出一个解决方法。您应该编写一个扩展 EntityManager 接口(interface)的 Java 抽象类,并通过委托(delegate)给其他 2 个具有不同名称的抽象方法来实现这 2 个违规方法,以消除歧义:

public abstract class EntityManagerWorkaround implements EntityManager {
@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses) {
return createStoredProcedureQueryForResultClasses(procedureName, resultClasses);
}

@Override
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings) {
return createStoredProcedureQueryForResultSetMappings(procedureName, resultSetMappings);
}

public abstract StoredProcedureQuery createStoredProcedureQueryForResultClasses(String procedureName, Class... resultClasses);

public abstract StoredProcedureQuery createStoredProcedureQueryForResultSetMappings(String procedureName, String... resultSetMappings);

}

现在您可以从 Scala 扩展抽象类并实现消除歧义的方法:
class EntityManagerImpl extends EntityManagerWorkaround {
override def createStoredProcedureQueryForResultClasses(procedureName: String, resultClasses: Class[_]*) = ???

override def createStoredProcedureQueryForResultSetMappings(procedureName: String, resultSetMappings: String*) = ???
}

关于scala - 如何使用多个可变参数方法在 Scala 中实现 Java 接口(interface)(类型橡皮擦问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24132089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com