如何使用多个可变参数方法(类型橡皮擦问题)在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*) = ??? } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |