2014-02-10 23 views
0
[error] both method addVertex in class OrientBaseGraph of type (x$1: Any, x$2: <repeated...>[Object])com.tinkerpop.blueprints.impls.orient.OrientVertex 
[error] and method addVertex in class OrientBaseGraph of type (x$1: Any)com.tinkerpop.blueprints.impls.orient.OrientVertex 
[error] match argument types (String) 
[error]   val npNode = g.addVertex(f"class:$NPPhrase") 
[error] 

我該如何讓Scala選擇我想要調用的方法(更具體的方法)?Scala重載的方法解決問題。如何讓編譯器選擇正確的方法?

哦,雖然在這方面g.addVertext(...,Nil)語義上相同,我仍然想知道如何解決上述問題。

+0

請顯示代碼! –

+0

你會如何處理代碼?它只是一個以字符串作爲輸入的方法。好吧,也許你需要看看'NPPhrase'是什麼:'def NPPhrase =「NPChunkPhrase」' –

+0

歡呼聲,那個人有一個明智的答案(創建一個java消歧類)「。 –

回答

3

編譯器向你說明了正確的東西。

addVertex(f"class:$NPPhrase")匹配addVertex(Any)addVertex(x$1: Any, x$2: Any*)。 這是因爲x$2參數可以是空的,調用addVertex(x$1: Any, x$2: Any*)addVertex("whatever")等)時,你可以忽略它

的選項有:

  1. 重命名的方法之一。
  2. addVertex(x$1: Any, x$2: Any*)簽名更改爲addVertex(x$1: Any, x$2: Any, x$3: Any*),以便它僅處理具有2個或更多參數的調用。 (我假設你的addVertex(x$1: Any)addVertex(x$1: Any, x$2: Any*)表現爲一個參數相同)
+0

是的:/但我不'無法訪問該代碼,它是OrientDB的一部分,當然Scala有一些機制來處理遺留代碼 –

+1

嗯,這確實是一個很好的觀察結果..我想你正在爲OrientDB使用某種Java庫。問題在於Scala把它看作一個顯而易見的原因(它本身不能選擇調用哪個方法)的編譯錯誤,但是Java只是運行該方法而沒有可變參數,甚至沒有抱怨 – serejja

+0

看起來這是一個已知問題。請閱讀此:http://stackoverflow.com/questions/3313929/how-do-i-disambiguate-in-scala-between-methods-with-vararg-and-without – serejja