risposta di Pelotom copre la teoria abbastanza piacevole, ecco alcuni esempi per rendere più chiaro:
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
}
Come si può vedere il tipo di attribuzione può essere utilizzato per risolvere disambiguazioni. A volte possono essere irrisolvibili dal compilatore (vedere più avanti), che segnalerà un errore e sarà necessario risolverlo. In altri casi (come nell'esempio) usa solo il metodo "sbagliato", non quello che vuoi. foo(a: String)
non viene compilato, a indicare che l'attribuzione del tipo non è un cast. Confrontalo con la riga precedente, dove il compilatore è felice, ma ottieni un'eccezione, quindi l'errore viene rilevato con l'attribuzione del tipo.
Si otterrà un'ambiguità non risolvibile se anche si aggiunge un metodo di
def foo(xs: Any*) {
println("vararg")
}
In questo caso la prima e la terza invocazione di foo non verrà compilato, come il compilatore non può decidere se si desidera chiamare il foo con un singolo parametro Any, o con i varargs, dato che entrambi sembrano ugualmente buoni => devi usare un attribtion di tipo per aiutare il compilatore.
Modifica puoi anche What is the purpose of type ascription in Scala?
fonte
2010-08-05 07:10:58
Un caso dove tipo annotazione è necessario è quando si desidera specificare il tipo per null, ad es quando si utilizzano le API Java. – Landei
Grazie per questa grande spiegazione! –
@pelotom: Hey il tuo esempio è fantastico! "ciao": Int ... Non ho mai visto o usato impliciti in quel modo ma veramente una cosa interessante. – soc