Tra*_*ens 15 scala scala-java-interop
我目前正在将应用程序的一部分移植到scala,它使用Oval库.方法问题是Validator.validate方法.它有两个 签名:
List<ConstraintViolation> validate(Object validatedObject)
List<ConstraintViolation> validate(Object validatedObject, String... profiles)
Run Code Online (Sandbox Code Playgroud)
scala代码看起来通常如下:
def validate(toValidate: AnyRef) = {
val validator = createValidator
validator.validate(toValidate)
}
Run Code Online (Sandbox Code Playgroud)
并且错误消息:
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)
Run Code Online (Sandbox Code Playgroud)
我怎样才能明白这一点?
jkl*_*jkl 11
我认为这可能是一个副本,如何在使用vararg和不使用valarg的方法之间消除Scala中的歧义
基本上,它是一个已知的java-scala-interop问题,唯一的解决方法是在Scala中使用额外的Java适配器.
我所知道的唯一方法是使用反射:
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]]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9152 次 |
最近记录: |