これが機能しない理由がわかりません:
def f[A: Double](x: A) = x / 4 // error: "Double does not take type parameters"
println(f(87.7))
これが機能している間:
def f[A <: Double](x: A) = x / 4
println(f(87.7))
唯一の違いは、最初のケースでは特定の型を指定するだけで、2 番目のケースでは型の上限を定義することです。
これ[A: Double]
は、型パラメーターを定義する正しい方法ではないためです。この形式は、バインドされたクラス マニフェスト コンテキストを定義するために適用できます(Scala 2.8 の新機能 - リンクについては @mhs に感謝します)。ただし、ClassManifest[T]
コンテキスト境界を表すために使用される型はパラメーター化された型であるためDouble
、クラス マニフェストとしては適していません。
ただし、一般的な配列作成の問題を解決するためにコンテキスト境界とマニフェストが導入されたことに注意してください。したがって、ここで使用する意味はありません。関数は、上記のように、配列とは関係がないためです。
正式な型パラメーターがこの定義の形式を持つ場合:
def floob[Glorp : Fleeb](arg1: Glorp): Swish = ...
...これは、この定義の単なる構文糖衣です。
def floob[Glorp](arg1: Glorp)(implicit i1: Fleeb[Glorp]): Swish = ...
これはコンテキスト バウンドと呼ばれます。
Double
これは、型パラメーターを取らないことについて診断を受けている理由を説明しています。
この単一のコロンの使用は、型注釈および型帰属で使用されるものとはまったく無関係であるため、コロンの両側にスペースを使用してコンテキスト境界を一律に記述し、左側にスペースを使用して型注釈または型帰属を記述することはありません (例外を除く)。必要に応じて、左側の名前が英数字ではなく句読点の場合)。