16

可能重复:
如何在 Scala 中消除带可变参数和不带可变参数的方法之间的歧义

我目前正在将应用程序的一部分移植到 scala,它使用 Oval 库。该方法的问题是 Validator.validate 方法。它有两个 签名

List<ConstraintViolation> validate(Object validatedObject)
List<ConstraintViolation> validate(Object validatedObject, String... profiles) 

scala 代码通常如下所示:

def validate(toValidate: AnyRef) = {
  val validator = createValidator
  validator.validate(toValidate)
}

和错误信息:

error: ambiguous reference to overloaded definition,
[INFO] both method validate in class Validator of type (x$1: Any,x$2: <repeated...>[java.lang.String])java.util.List[net.sf.oval.ConstraintViolation]
[INFO] and  method validate in class Validator of type (x$1: Any)java.util.List[net.sf.oval.ConstraintViolation]
[INFO] match argument types (AnyRef)
[INFO]       this.validator.validate(toValidate)

我怎样才能得到这个是明确的?

4

2 回答 2

11

我认为这可能是如何在 Scala 中消除带可变参数和不带可变参数的方法之间的歧义

基本上,这是一个已知的 java-scala-interop 问题,唯一的变通方法涉及额外的 Java 适配器,以便在 Scala 中访问。

于 2011-06-02T00:37:11.440 回答
5

我知道的唯一方法是使用反射:

val ambiguous = validator.getClass.getMethods.filter(_.getName == "validate")
val wanted = ambiguous.find(_.getParameterTypes.length == 1).get
wanted.invoke(validator, toValidate).asInstanceOf[java.util.List[ConstraintViolation]]
于 2011-06-02T00:42:02.890 回答