私はあなたに3つの理由を与えることができます。
1)ボイラープレートコードを非表示にします。
いくつかのリストを並べ替えましょう:
import math.Ordering
List(1, 2, 3).sorted(Ordering.Int) // Fine. I can tell compiler how to sort ints
List("a", "b", "c").sorted(Ordering.String) // .. and strings.
List(1 -> "a", 2 -> "b", 3 -> "c").sorted(Ordering.Tuple2(Ordering.Int, Ordering.String)) // Not so fine...
暗黙のパラメータを使用する場合:
List(1, 2, 3).sorted // Compiller knows how to sort ints
List(1 -> "a", 2 -> "b", 3 -> "c").sorted // ... and some other types
2)ジェネリックメソッドを使用してAPIを作成できます。
scala> (70 to 75).map{ _.toChar }
res0: scala.collection.immutable.IndexedSeq[Char] = Vector(F, G, H, I, J, K)
scala> (70 to 75).map{ _.toChar }(collection.breakOut): String // You can change default behaviour.
res1: String = FGHIJK
3)それはあなたが本当に重要なことに集中することを可能にします:
Future(new JLinkedList[B]())(executor) // meters: what to do - `new JLinkedList[B]()`. don't: how to do - `executor`
それほど悪くはありませんが、2つの先物が必要な場合はどうなりますか?
val f1 = Future(1)(executor)
val f2 = Future(2)(executor) // You have to specify the same executor every time.
Implicitは、すべてのアクションの「コンテキスト」を作成します。
implicit val d = executor // All `Future` in this scope will be created with this executor.
val f1 = Future(1)
val f2 = Future(2)
3.5)暗黙のパラメータにより、タイプレベルのプログラミングが可能になります。形のないを参照してください。
「コードのあいまいさ」について:
暗黙的を使用する必要はありません。あるいは、すべてのパラメーターを明示的に指定することもできます。見た目が醜いこともありますが(sorted
例を参照)、それは可能です。
パラメータとして使用されている暗黙の変数が見つからない場合は、コンパイラに問い合わせることができます。
>echo object Test { List( (1, "a") ).sorted } > test.scala
>scalac -Xprint:typer test.scala
あなたはmath.this.Ordering.Tuple2[Int, java.lang.String](math.this.Ordering.Int, math.this.Ordering.String)
出力で見つけるでしょう。