5

Scala 2.10.4 では、次のようにコンパイルされます。

trait Foo[-U,T]{
  type Contra = U
}

しかし、2.11.0 では同じことが失敗します:

反変型 U は、型 Contra trait Foo[-U,T] {type Contra = U} の型 U の不変位置に発生します。

利用可能な回避策はありますか? Scala ライブラリを 2.11 に移植しようとすると、コンパイラが大量の暗黙的な定義を取得するために反変型が必要になります (つまり、U を不変にすることは選択肢にないようです)。

ありがとう

4

2 に答える 2

4

どうやら 2.7 以降および 2.11 以前では、これは型チェッカーのバグでした。OPでの接近防止が機能になりました。これは良いことです。o_Oのようなものです。

回避策は、2.11 より前のバージョンと同じようにすることです。違いは、以前はコンパイラが支援してくれると思っていたのに対し、今では自分で作業していることを知っているということです。

無知は至福ですよね?

回避策:

import annotation.unchecked._
trait Foo[-U,T]{
  type Contra = (U @uncheckedVariance)
}
于 2014-05-01T06:09:49.803 に答える
4

利用可能な回避策があるとは想像できません。私がこれを言う理由は、すべてパス依存型のサポートに関するものです。

 def foo[T <: Foo[A,B]](that: T): that.Contra

Contraタイプを間違った位置に配置します。演算の結果として反変型を返すことはできません。おそらく、これらの検索と検証には非常に多くの作業が必要になるため、コンパイラの作成者は、この小さなコーナーケースが負担を大きくしすぎている、発見したコンパイラのバグであると判断しました。

ちなみに、これは私の勝手な憶測です。どの方法がどれであるかを理解するには、コンパイラコードを読む必要があります。

于 2014-04-30T14:40:28.867 に答える