2016-03-07 46 views
0

我是scala的新學習者。有問題我無法解決。我使用Java反射來檢查這是用Scala編寫的方法(我沒有找到在斯卡拉有道) 代碼是這樣的:Java的Method.isVarArgs()不能在scala中使用方法

case class SomeClass(udf: UDF) { 
    // Get Method object of "eval" method in udf 
    val evalMethod: Method = { 
     var evalMethods: ListBuffer[Method] = new ListBuffer[Method] 
     udf.getClass.getMethods.foreach(m => { 
      if (m.getName().equals("eval")) { 
       evalMethods += m 
      } 
     }) 
     if (evalMethods.length != 1) { 
      throw new Exception(s"$udf must have only one eval method") 
     } 
     evalMethods(0) 
    } 

    val evalParamsType = { 
     val hasVarArgs = evalMethod.isVarArgs // Not work here 
     println("varargs:" + hasVarArgs) // Always false 
     for (param <- evalMethod.getParameterTypes) { 
      // do some thing 
     } 
     // return some thing 
    } 
} 

trait UDF { 
} 

object SomeUDF extends UDF { 
    def eval(fields: String*) = { 
     // do something here 
    } 
} 

可能看起來怪怪的代碼,我不得不使用反射來辦這項工作,因爲UDF中的「eval」方法可以有不同的參數和返回類型。 (這是另一個問題......)

看來,Java中的Method類無法識別scala中的可變參數,有沒有辦法在java或scala中做這項工作?

+0

難道你不需要首先將hasVarArgs分配給val或var嗎? – hasumedic

+0

哦,你說的對,那是錯誤的編輯,我會修復它。問題不在於此,但仍然感謝 – SleePy

+0

這整個事情看起來很可疑。爲什麼要這樣做呢?問你這個問題。如果你沒有找到答案,答案將是「因爲我想做bla bla bla」谷歌「如何解決bla bla在斯卡拉」,問StackOverflow。 –

回答

3

Scala的可變參數編碼方案與java不同。

// used :javap SomeUDF in scala repl 
public void eval(scala.collection.Seq<java.lang.String>); 

斯卡拉使用scala.collection.Seq。 Java使用Array。 您可以使用@scala.annotation.varargs來告訴編譯器生成java可變參數橋接方法(將調用scala變體)。

object SomeUDF extends UDF { 
    @scala.annotation.varargs 
    def eval(fields: String*) = { 
     // do something here 
    } 
} 

scala repl javap輸出現在包含java varargs方法。

public void eval(java.lang.String...) 
+0

這非常有幫助! – SleePy