2011-06-02 19 views
14

Olası Çoğalt ile: Şu anda skalasına bir uygulamanın parçası taşıma ediyorum ve onu Oval kitaplığı kullanır
How do I disambiguate in Scala between methods with vararg and withoutScala - aşırı tanımına belirsiz referans - varargs

. Yöntem, Validator.validate yöntemidir.

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

scala kodu şöyle genellikle görünür:: O twosignatures sahiptir

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

Ve hata iletisi:

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) 

Nasıl Buna açıklık olarak edilebilir alabilirim?

+0

Bu yığın taşması üzerine aşırı tanım soruya belirsiz bir referans olarak belirdi. Bu gönderiyi silmeli miyim? Rex Kerr, orijinalde olmayan bir cevap vermesine rağmen. – OleTraveler

+0

Cevabımı orada yeniden oluşturdum ve iki şekilde genişlettim: yöntemler için yazdığımın kısa bir formu ve kurucular için çalışan bir alternatif. –

cevap

5

bildiğim tek yol yansımasını kullanmaktır:

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]] 
İlgili konular