3

以下のコードで。

私の予想では、それはまたはTの型でなければならないので、への呼び出しはおそらくコンパイルされるべきではありません (?)。上限を使用した同様の実験では、予想されるタイプチェック エラーが発生します。BAlowerBound(new D)

ヒントをくれてありがとう。

object varianceCheck {
  class A {
    override def toString = this.getClass.getCanonicalName
  }

  class B extends A
  class C extends B
  class D extends C

  def lowerBound[T >: B](param: T) = { param }

  println(lowerBound(new D))                      //> varianceCheck.D
}
4

2 に答える 2

5

実装を使用すると、次のように記述できます。

scala>   def lowerBound[T >: B](param: T) = { param }
lowerBound: [T >: B](param: T)T

scala> lowerBound(new AnyRef {})
res0: AnyRef = $anon$1@2eef224

whereAnyRefはすべてのオブジェクト/参照型のスーパー型です (実際には JavaObjectクラスのエイリアスです)。そして、これは正しい、 T >: B型パラメーターTまたは抽象型Tが type のスーパータイプを参照することを表しますB

の悪い例がtoStringあります。このメソッドにはすべてのオブジェクト型があるためですが、に変更すると、たとえば on に変更すると、someMethodコンパイルされlowerBoundません。

<console>:18: error: value someMethod is not a member of type parameter T
       def lowerBound[T >: B](param: T) = { param.someMethod }

これを に変更するとT <: B、タイプ のパラメーターTが のサブクラスであるBことparamを意味しますsomeMethod

def lowerBound[T <: B](param: T) = { param.someMethod }
于 2013-10-07T05:16:04.197 に答える