暗黙パラメーターがどこから来るのかを理解しようとしています。ここでは、ジェネリック型の制約の暗黙的な解像度の簡単なデモです:スカラーのかっこなしのメソッド呼び出し(暗黙的なパラメーター付き)
class ImplicitTypeConstraint[+T](val t : T) {
def doSome1(implicit ev: T <:< Int) = println("Int value = " + ev(t))
def doSome2(implicit ev: T <:< Int, u : Unit) = println("Int value = " + ev(t))
def doSome3(u : Unit)(implicit ev: T <:< Int) = println("Int value = " + ev(t))
}
は今、私はこの
val itc = new ImplicitTypeConstraint(10)
itc.doSome1 //compiles fine
itc.doSome1() //compile error, Cannot resolve reference doSome1 with such signature
itc.doSome2 //compile error, not enough arguments for method doSome2
itc.doSome2() //compile error, Cannot resolve reference doSome2 with such signature
itc.doSome3 //compile error, Cannot resolve reference doSome3 with such signature
itc.doSome3() //compiles fine
をしようとした質問がdoSome1
とdoSome2
の署名の違いは何であるか、ですか?私はJavaから来て、私は、foo()
は、の明示的なのパラメータを持っていない関数を呼び出すと思っていましたが、それはタイプUnit
の1つのパラメータを持つ関数を探しているようです。
UPD:Itellijはプロジェクトを明示的にビルドする前にエラーを表示しませんでした。 doSome2()
とdoSome2
はコンパイルを拒否します。
* foo()は明示的なパラメータを持たない関数を呼び出します*ここで 'foo()'とは何ですか?私はあまりあなたの質問が何であるかは分かりません。 –
@YuvalItzchakovここにfooはありません。パラメータなしで関数 'foo'について話をしました。私は 'foo'メソッドが明示的なパラメータなしで定義されていれば、' foo() 'メソッドを呼び出すと言っています。 – user3663882
'foo'がかっこなしで宣言されていなければ、コンパイルされません。'Some1'は明示的なパラメータを必要としません。' Some2'は明示的なパラメータを必要としません。あなたに何が混乱しているのかよくわからないのですか? –