Scala-对重载定义的不明确引用--使用varargs
可能重复:Scala-对重载定义的不明确引用--使用varargs,scala,scala-java-interop,Scala,Scala Java Interop,可能重复: 我目前正在将一个应用程序的一部分移植到scala,它使用了Oval库。方法是Validator.validate方法。它有: 以及错误消息: 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.L
我目前正在将一个应用程序的一部分移植到scala,它使用了Oval库。方法是Validator.validate方法。它有: 以及错误消息:
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)
错误:对重载定义的引用不明确,
[INFO]这两个方法都在类内验证类型为(x$1:Any,x$2:[java.lang.String])java.util.List[net.sf.oval.ConstraintViolation]的类内验证程序
[INFO]和类型为(x$1:Any)java.util.List[net.sf.oval.ConstraintViolation]的类内验证程序的方法验证
[信息]匹配参数类型(AnyRef)
[信息]此.validator.validate(toValidate)
我怎样才能使这一点明确无误呢?我认为这可能是
基本上,这是一个已知的java scala互操作问题,唯一的解决方法是使用额外的java适配器,以便在scala中访问。我知道的唯一方法是使用反射:
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]]
对于堆栈溢出的重载定义问题,它似乎是一个模棱两可的引用。我应该删除这个帖子吗?尽管Rex Kerr给出了一个与原始答案不同的答案。我在那里重新创建了我的答案,并用两种方式对其进行了扩展:一种是我为方法编写的简短形式,另一种是适用于构造函数的替代形式。有时,通过显式创建
Seq
并使用,例如validator.validate,您可以避免使用Java适配器(要验证,请使用数组[String]():*)
。请参阅中Yawar和Teimuraz的答案。
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)
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]]