2011-06-02 89 views
14

可能重複:
How do I disambiguate in Scala between methods with vararg and without斯卡拉 - 曖昧參考超載定義 - 可變參數

我目前將應用程序移植到斯卡拉的組成部分,它採用了橢圓形庫。該方法的問題是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) 

如何我能得到這個被不含糊?

+0

它確實出現了不明確的引用對堆棧溢出超載的定義問題。我應該刪除這篇文章嗎?儘管雷克斯克爾確實給出了一個不在原文中的答案。 – OleTraveler 2011-06-02 16:16:59

+0

我在那裏重新創建了我的答案,並以兩種方式對其進行了擴展:我爲方法編寫的簡短表單以及用於構造函數的替代方法。 – 2011-06-02 18:10:34

回答

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