2017-06-09 19 views
0

我知道有類似的問題,但答案並不令人滿意。如何處理groovy模糊方法超負荷優雅

在調用null作爲參數的方法時,出現Groovy模糊方法重載錯誤。

例如爲:

class A{ 
    sampleMethod (B bObj){ 
     if(bObj == null) { 
      handleNullArgumentGracefully() 
     } 
     ... do some cool stuff ... 
    } 

    sampleMethod (C cObj){ 
     ... do some other cool stuff ... 
    } 
} 

現在,當我打電話sampleMethod(null)常規不知道它應該調用哪個方法。這清楚是否有可能將這兩個方法設置爲默認方法來處理這樣的空調用?我想處理這對被叫側和主叫側(我不想投在發送方的東西)

UPDATE: 我找到了解決辦法,怎麼會工作,但我不知道爲什麼:轉換非默認方法的封閉性

class app { 
    static void main(String[] args) { 
     def a = new A() 
     a.sampleMethod(new B()) 
     a.sampleMethod(new C()) 
     a.sampleMethod(null) 
    } 
} 

class A { 
    def sampleMethod(B bObj) { 
     if (bObj == null) { 
      println("handle null") 
     } 
     println("1") 
    } 

    def sampleMethod = { C cObj -> 
     println("2") 
    } 
} 

class B { 

} 

class C { 

} 
+0

您可以修改一個方法,像「sampleMethod(B BOBJ = NULL )'。所以這種方法將被稱爲即使如果bObj爲空 –

+0

謝謝,我會嘗試:) – warch

+0

不幸的是,這不起作用 – warch

回答

1

下面會失敗,並Ambiguous method overloading for method A#sampleMethod

class A{ 
    def sampleMethod (Number o=null){ 
     println "num $o" 
    } 

    def sampleMethod (String o){ 
     println "str $o" 
    } 
} 

new A().sampleMethod(null) 

這一項就可以了(對象將呼籲空):

class A{ 
    def sampleMethod (Number o=null){ 
     println "num $o" 
    } 

    def sampleMethod (String o){ 
     println "str $o" 
    } 

    def sampleMethod(Object o){ 
     println "obj $o" 
    } 
} 

new A().sampleMethod(null) 

但我喜歡這一個:

class A{ 
    def _sampleMethod (Number o){ 
     println "num $o" 
    } 

    def _sampleMethod (String o){ 
     println "str $o" 
    } 

    def sampleMethod(Object o){ 
     if(o==null){ 
      println "null" 
      return null 
     }else if(o instanceof Number){ 
      return _sampleMethod ((Number) o) 
     }else if(o instanceof String){ 
      return _sampleMethod ((String) o) 
     } 
     throw new IllegalArgumentException("wrong argument type: ${o.getClass()}") 
    } 
} 

new A().sampleMethod(null) 
+0

很好:) 你能解釋爲什麼我更新的問題的作品? – warch

+0

這是因爲第二個方法聲明爲閉包變量(不是真正的方法)。 當groovy試圖找到空方法 - 只有一個方法 - 所以沒有例外。對於'C',它試圖找到方法 - 找不到,所以它查找閉包變量 - 有一個。 // btw。在這種情況下,你不需要'B bObj = null' – daggett

+0

謝謝:)當groovy試圖找到一個方法時,不知道確切的查找順序。是的''= null'默認只是爲了測試 – warch

相關問題