2017-06-09 4 views
0

Ich weiß, es gibt ähnliche Fragen, aber die Antworten sind nicht zufriedenstellend.Wie groovy mehrdeutige Methode Überladung anmutig behandeln

Ich bekomme eine Groovy mehrdeutige Methode Überladungsfehler beim Aufruf einer Methode mit Null als Parameter.

z.B .:

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

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

jetzt, wenn ich rufe sampleMethod(null) groovy nicht weiß, welche Methode sollte es aufrufen. Das ist klar aber gibt es eine Möglichkeit, eine Methode dieser beiden als Standardmethode, um solche Nullaufrufe zu behandeln? Ich möchte dies auf der Seite und nicht auf der Anrufer Seite Rufenen behandeln (ich will nicht etwas auf der Anruferseite werfen)

UPDATE: ich eine Lösung gefunden, wie es könnte Arbeit, aber ich weiß nicht, warum:

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

Sie eine Methode wie ‚sampleMethod ändern können (B bobj = null) ". So wird diese Methode aufgerufen, selbst wenn if bObj null ist –

+0

danke ich werde das versuchen :) – warch

+0

Leider funktioniert das nicht – warch

Antwort

1

folgendes mit Ambiguous method overloading for method A#sampleMethod

wird scheitern die nicht Standard-Methode zu einer Schließung Eigenschaft umwandeln
class A{ 
    def sampleMethod (Number o=null){ 
     println "num $o" 
    } 

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

new A().sampleMethod(null) 

dieses funktioniert (Objekt wird für null aufgerufen werden):

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) 

aber Ich mag dieses:

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

nice :) können Sie erklären, warum meine aktualisierte Frage funktioniert? – warch

+0

Das liegt daran, dass die zweite Methode als Closure-Variable deklariert wurde (nicht wirklich eine Methode). wenn groovy versucht, Methode für null zu finden - es gibt nur eine Methode - also keine Ausnahme. für 'C' versucht es Methode zu finden - nicht gefunden, also sucht es nach Abschlussvariablen - es gibt eine Eins. // btw. in diesem Fall brauchst du nicht "B bObj = null" – daggett

+0

danke :) kannte die genaue Suchfolge nicht, wenn groovy versucht, eine Methode zu finden. Yeah taht '= null' Standard war nur zum Testen – warch

Verwandte Themen