Расширяя ответ Кевина и объясняя, почему scaladoc не может сказать вам, что существует неявное преобразование: неявные преобразования вступают в действие только тогда, когда ваш код не компилируется иначе.
Выможет видеть это как механизм восстановления ошибок типа, который активируется во время компиляции.В этом случае Array[String]
не имеет метода mkString
.Этот код не будет компилироваться, потому что этот метод не существует в Array[T]
.Но перед отказом компилятор будет искать неявное преобразование в области.
Бывает, что Predef
приносит несколько неявных преобразований в области и одно, которое будет применяться здесь.
Выяснить, какое неявное преобразование применимо, можно с помощью компиляции с флагом -Xprint:typer
.В этом случае будет напечатано:
$ scalac -d classes -Xprint:typer A.scala
[[syntax trees at end of typer]]// Scala source: A.scala
package <empty> {
final object myApp extends java.lang.Object with App with ScalaObject {
def this(): object myApp = {
myApp.super.this();
()
};
scala.this.Predef.println("Echo ".+(scala.this.Predef.refArrayOps[String](myApp.this.args).mkString(" ")))
}
}
Таким образом, вы можете видеть, что Predef.refArrayOps
на самом деле является неявным использованным преобразованием.Он преобразует ваш массив в ArrayOps[String]
, который имеет mkString
метод .
Так что, имея в виду, вы можете понять, почему scaladoc для Array
не могу сказать вам, что неявное преобразование может применяться.Это может быть что угодно.На самом деле это полностью основано на том, что такого метода не существует.Только компилятор будет знать, что неявное было найдено на основе кода.
Вы даже можете определить свое собственное неявное преобразование:
object myApp extends App {
implicit def myImplicit(arr:Array[String]) = new {
def mkString(s:String) = arr.length + s
}
println("Echo " + (args mkString(" ")))
}
, которое будет иметь следующий эффект:
$ scala -cp classes myApp a b c
Echo 3
Очевидно, что скардок не сможет это показать.Обратите внимание, что плагин Eclipse Scala может привести к реализации mkString
, нажав F3 (в итоге вы получите TraversableOnce
).