加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:48:43 所属栏目:安全 来源:网络整理
导读:我有一个 Scala类正在尝试实现一个 Java接口( JavaEE 7中的EntityManager用于特定的单元测试).界面有这两种方法(其中包括): public StoredProcedureQuery createStoredProcedureQuery(String procedureName,Class... resultClasses);public StoredProcedure
我有一个 Scala类正在尝试实现一个 Java接口( JavaEE 7中的EntityManager用于特定的单元测试).界面有这两种方法(其中包括):

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 = ???

我无法想出一个解决方案.我的Google搜索也未能找到并回答.我正在使用Scala 2.10.4.

解决方法

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

我只能就此问题提出解决方法.您应该编写一个扩展EntityManager接口的Java抽象类,并通过委托其他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*) = ???
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读