Pelotom réponse du couvre la théorie assez sympa, voici quelques exemples pour le rendre plus clair:
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
}
Comme vous pouvez le voir le type de nom peut être utilisé pour résoudre disambiguations. Parfois, ils peuvent être encore sans réponse par le compilateur (voir plus loin), ce qui signale une erreur et vous devez le résoudre. Dans d'autres cas (comme dans l'exemple), il utilise juste la "mauvaise" la méthode, pas ce que vous voulez. foo(a: String)
ne compile pas, montrant que le type d'attribution n'est pas un casting. Comparer avec la ligne précédente, où le compilateur est heureux, mais vous obtenez une exception, si l'erreur est détectée, alors le type d'attribution.
Vous recevrez un insolubles ambiguïté si vous aussi ajouter une méthode
def foo(xs: Any*) {
println("vararg")
}
Dans ce cas, la première et la troisième invocation de foo pas compiler, le compilateur ne peut pas décider si vous voulez l'appeler foo avec un seul Tout param, ou avec les varargs, comme les deux d'entre eux semble être tout aussi bon => vous devez utiliser un type d'attribution à l'aide du compilateur.
Modifier voir aussi Quel est le but de type nom de Scala?