Pelotom Antwort deckt die Theorie sehr schön, hier sind einige Beispiele deutlicher zu machen:
def foo(x: Any) {
println("any")
}
def foo(x: String) {
println("string")
}
def main(args: Array[String]) {
val a: Any = new Object
val s = "string"
foo(a) // any
foo(s) // string
foo(s: Any) // any
foo(a.asInstanceOf[String]) // compiles, but ClassCastException during runtime
foo(a: String) // does not compile, type mismatch
}
Wie Sie der Typ Zuschreibung sehen kann, kann verwendet werden Begriffsklärung zu lösen. Manchmal können sie vom Compiler nicht aufgelöst werden (siehe später), was einen Fehler meldet und Sie müssen ihn beheben. In anderen Fällen (wie im Beispiel) wird nur die "falsche" Methode verwendet, nicht die gewünschte. foo(a: String)
kompiliert nicht und zeigt, dass die Typzuweisung keine Besetzung ist. Vergleichen Sie es mit der vorherigen Zeile, wo der Compiler glücklich ist, aber Sie erhalten eine Ausnahme, so dass der Fehler dann mit der Typzuschreibung erkannt wird.
Sie eine nicht auflösbare Mehrdeutigkeit, wenn man auch ein Verfahren
def foo(xs: Any*) {
println("vararg")
}
In diesem Fall ist der erste und die dritte Aufruf von foo kompiliert nicht hinzufügen, da der Compiler nicht entscheiden können, ob Sie die foo anrufen mögen mit einem einzigen Any-Parameter oder mit den Varargs, da beide gleich gut zu sein scheinen => Sie müssen eine Typ-Beschreibung verwenden, um dem Compiler zu helfen.
bearbeiten siehe auch What is the purpose of type ascription in Scala?
Ein Fall, in dem Typanmerkung ist benötigt wird, wenn Sie den Typ für null angeben möchten, z bei Verwendung von Java-APIs. – Landei
Danke für diese großartige Erklärung! –
@pelotom: Hey, dein Beispiel ist großartig! "hi": Int ... Ich habe niemals implicits auf diese Weise gesehen oder benutzt, aber wirklich eine interessante Sache. – soc