2017-11-28 8 views
2

渡されている複雑なオブジェクト型で動作するような型推論が可能かどうかを調べようとしています。コントロール。現在、私は使用しているジェネリック(バータイプ)を具体的に定義しなければなりません。複雑な汎用オブジェクトを渡したときの型推論の例

trait Martini[A] 

trait Foo[A <: Martini[A]] { 
    def foo(): A 
} 

class Bar extends Martini[Bar] { 
    def whoAmI = "Bar" 
} 

object Bar extends Foo[Bar] { 
    override def foo(): Bar = new Bar() 
} 

object Test extends App { 
    // val bar: Bar = test(Bar) // Want to do this, but doesn't work 
    val bar: Bar = test[Bar, Bar.type](Bar) // Works 
    println(bar.whoAmI) 

    def test[A <: Martini[A], F <: Foo[A]](f: F): A = { 
    f.foo() 
    } 
} 

私がコメントした行は、私が達成したいものです。ご協力いただきありがとうございます。

+0

まあ... '分散 'が重要です。 –

+1

@ SarveshKumarSinghいいえ、この質問のためではありません。 –

答えて

1

通常、パラメータータイプとして使用されるFのようなタイプパラメーターを導入することはありません。

def test[A <: Martini[A]](f: Foo[A]): A = { 
    f.foo() 
} 

に簡略化することができます。これは、ここでも型の推論を修正します。

+0

'Foo'がcontra-variantの場合はまだ動作しますか? 'Foo [+ A]'や 'Foo [-A]'の 'variance'を指定しないと' default'の動作は何ですか? –

+0

はい(もちろん、 'foo'と' test'は異なるタイプである必要があります。なぜなら、 'Foo'は反変的ではないからです)。 –

+0

パーフェクト、ありがとう。 – Marcus

関連する問題