【问题标题】:Scala - ambiguous reference to overloaded definition -- with varargs [duplicate]Scala - 对重载定义的模糊引用 - 带有可变参数 [重复]
【发布时间】:2014-09-16 17:20:02
【问题描述】:

可能重复:
How do I disambiguate in Scala between methods with vararg and without

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

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)

我怎样才能让它明确?

【问题讨论】:

  • 这似乎是对堆栈溢出的重载定义问题的模棱两可的引用。我应该删除这个帖子吗?尽管 Rex Kerr 确实给出了原作中没有的答案。
  • 我在那里重新创建了我的答案,并以两种方式对其进行了扩展:一种是我为方法编写的简短形式,另一种适用于构造函数。

标签: scala scala-java-interop


【解决方案1】:

我认为这可能与How do I disambiguate in Scala between methods with vararg and without 重复

基本上,这是一个已知的 java-scala-interop 问题,唯一的解决方法是需要额外的 Java 适配器才能在 Scala 中访问。

【讨论】:

  • 有时您可以通过显式创建Seq 并使用_* type annotation 来避免Java 适配器,例如validator.validate(toValidate, Array[String](): _*)。在duplicate question 中查看 Yawar 和 Teimuraz 的答案。
【解决方案2】:

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

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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多