2017-02-07 8 views
3

スカラ型の上限型パラメータ化の例を次に示します.TはCommandのサブタイプでなければなりません。スカラ型パラメータ化における複数のパラメータ型の理解

def getSomeValue[T <: Command] = ... 

はしかし、今日は、複数のパラメータの型と型パラメータの次の実装を発見し、私はスカラ座で初心者だとして、私はそれがない実際に何かを理解するのは非常にできませんよ。これはTがCommand、Foo、Barのいずれかのサブタイプでなければならないということですか?

def getSomeValue[T <: Command : Foo : Bar] = ... 

答えて

3

型パラメータ指定のスタンドアロンのコロンは、より複雑で複雑なパラメータ呼び出しのために実際には簡略化されています(構文糖)。

例:def f[N: Numeric](n: N) = ...

が本当にある:def f[N](n: N)(implicit ev: Numeric[N]) = ...

f(x)が呼び出されたときにNumeric[x.type]と一致する範囲内の暗黙のがなければならないことを意味。あなたの例のコードの断片でそう

、:

私たちが実際にそれをコンパイルするためにちょうど十分なスケルトンコードを提供することで、これを実証することができますdef getSomeValue[T <: Command : Foo : Bar] = ...

コンパイラはに、おおよそ、以下のことになります。

class Command {} 
class Foo[F] {} 
class Bar[B] {} 
class Cmd extends Command 

def getSomeValue[T <: Command : Foo : Bar](t: T) = t 

getSomeValue(new Cmd)(new Foo[Cmd], new Bar[Cmd]) 
        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
        // implicit parameters supplied explicitly 
+0

例をお寄せいただきありがとうございます。 –

3

これはTがコマンド、フーやバーのいずれかのサブタイプでなければならないことを意味しますか?

いいえ、上限はまだTに必要です。このメソッドを呼び出すときにの暗黙のインスタンスがFoo[T]およびBar[T]のスコープ内に存在する必要があります。これはContext Boundsと呼ばれ、その構文砂糖のためにされています

def getSomeValue[T <: Command](implicit f: Foo[T], b: Bar[T]) 

あなたは何を暗黙の意味を知らないなら、より多くのためのrefer to the documentation

+0

私はコンテクストバウンズについて知りませんでした。それを指摘していただきありがとうございます。 :) –

関連する問題