如何在Scala中使用多个可变参数方法实现Java接口(类型橡皮擦问题)? [英] How to implement Java interface in Scala with multiple variable parameter methods (type eraser issue)?

查看:147
本文介绍了如何在Scala中使用多个可变参数方法实现Java接口(类型橡皮擦问题)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Scala类,它正在尝试实现Java接口(JavaEE 7中的EntityManager用于特定的单元测试).该界面具有这两种方法(以及其他方法):

I have a Scala class that is trying to implement a Java interface (EntityManager in JavaEE 7 for unit testing purposes to be specific). The interface has these two methods (among others):

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

在Scala实现中,我有:

In the Scala implementation I have:

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.

I have not been able to come up with a work around. My Google searches also failed to find and answer. I'm using Scala 2.10.4.

推荐答案

AFAIK EntityManager Java接口不能直接在Scala中实现. Java可变参数在第一种方法中转换为Seq[Class[_]],在第二种方法中转换为Seq[String].由于进行了擦除,因此这两种方法看起来都具有相同的签名createStoredProcedureQuery(String, Seq[_]).

AFAIK the EntityManager Java interface cannot be implemented directly in Scala. The Java varargs are converted to Seq[Class[_]] in the first method and Seq[String] in the second method. Because of erasure, both methods then appear as having the same signature createStoredProcedureQuery(String, Seq[_]).

我只能针对此问题提出解决方法.您应该编写一个Java抽象类来扩展EntityManager接口,并通过委派给其他两个具有不同名称的抽象方法来实现这两个有问题的方法,以便消除歧义:

I can only propose a workaround for this issue. You should write a Java abstract class that extends the EntityManager interface and implement the 2 offending methods by delegating to 2 other abstract methods with different names in order to disambiguate:

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扩展抽象类并实现已消除歧义的方法:

Now you can extend the abstract class from Scala and implement the disambiguated methods:

class EntityManagerImpl extends EntityManagerWorkaround {
  override def createStoredProcedureQueryForResultClasses(procedureName: String, resultClasses: Class[_]*) = ???

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

这篇关于如何在Scala中使用多个可变参数方法实现Java接口(类型橡皮擦问题)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆