2016-05-02 15 views
1

Ich bin nicht in der Lage zu verstehen, warum der folgende Code Typ Mismatch-Fehler gibt - Hier verwende ich Generika und bei Zeile 11 gibt es Typ Mismatch-Fehler. Sollte es nicht T als Int interpretieren?Warum erhalte ich hier einen Typ-Mismatch-Fehler?

object FunctionParamGeneric { 
    def main(args: Array[String]) : Unit= { 
    exec[Int](Fun[Int]) 
    } 

    def exec[T](f:() => T) : T = { 
    println("Inside exec") 
    f() 
    } 

    def Fun[T]() : T = { 
    println("Inside Fun with key ") 
    123 
    } 
} 

Wenn ich jedoch

object FunctionParamGeneric { 
    def main (args: Array[String]) : Unit= { 
    exec[Int](() => 1) 
    } 

    def exec[T](f:() => T) : T = { 
    println("Inside exec") 
    f() 
    } 

} 

tun es funktioniert gut. Da f im zweiten Snippet als Int bezeichnet wird, würde ich erwarten, dass dasselbe im ersten Code-Snippet passiert, aber das ist nicht der Fall. Warum nicht?

+0

Wenn Sie '123' zurückgeben möchten, warum möchten Sie den Rückgabetyp als' T' deklarieren? –

+0

Bitte entfernen Sie diese Zeilennummern aus Ihren Code-Schnipsel ... – Jubobs

Antwort

3

Erste Schnipsel:

Sie erhalten Fehler, weil Sie generischen Rückgabetyp für Fun angegeben haben, während Sie Int zurückkehren.

Angenommen, wenn dieser Ausdruck erlaubt wurde, nun diese beiden Aussagen berücksichtigen:

Fun[Int]() // would have returned 123 

Fun[String]() // what would be output? 

Die erste Anweisung 123 ohne Probleme zurückgekehrt wäre, aber was wäre die Ausgabe im zweiten Fall sein?

Deshalb sind solche Ausdrücke nicht erlaubt.

Zweiter Schnipsel:

Im zweiten Schnipsel es funktioniert, weil, wenn Sie exec[Int](() => 1) verwenden Sie eine wörtliche Funktion als Argument sind vorbei, während in dem ersten Schnipsel Sie Definition von Fun geben.


Um es weiter zu erklären, wenn man sich die Definition von exec aussehen:

def exec[T](f:() => T) : T 

Es dauert eine Function0 Funktion als Parameter (die jede Art zurückkehren können). Wenn Sie also exec[Int](() => 1) aufrufen, übergeben Sie die Funktion () => 1, die Int (Hinweis, dass dies keine generische Funktion ist) zurückgibt. Daher funktioniert es.

Während Sie im ersten Snippet waren, definierten Sie eine generische Funktion Fun mit generischem Rückgabetyp. Aber aus dem Körper der Funktion, die Sie zurückgegeben haben Int Wert.

+0

Dann, wie können wir Funktion ohne anonyme Funktion aufrufen? – user1147070

+0

Danke. Es löste meine Zweifel – user1147070

1

Ihr Problem liegt hier:

def Fun[T]() : T = { 
    println("Inside Fun with key ") 
    123 
} 

Sie implizit 123 Rückkehr sind. Das ist nicht vom Typ T, sondern vom Typ Int. Der Compiler erzeugt also einen Fehler.

Wenn Sie wollen Fun immer eine Int zurückgeben können Sie dies tun, indem Sie es als Fun(): Int = ... definieren.

Dann sollten Sie in der Lage zu nennen

exec[Int](Fun) 
Verwandte Themen