1

従属型_ >: a.typeに関連する型エイリアスを作成しようとしました。Scalaコンパイラが型パラメータのスーパータイプとしてワイルドカード型の宣言を禁止する理由

Scalaのコンパイラは、私は理解していなかったエラーを報告します。

scala> def foo[A](a: A) = { 
    | type F = Function1[_ >: a.type, Unit] 
    | } 
<console>:12: error: type mismatch; 
found : a.type (with underlying type A) 
required: AnyRef 
Note that A is unbounded, which means AnyRef is not a known parent. 
Such types can participate in value classes, but instances 
cannot appear in singleton types or in reference comparisons. 
     type F = Function1[_ >: a.type, Unit] 
           ^

私はa: A with AnyRefa: Aを交換した場合、それは動作します:

scala> def foo[A](a: A with AnyRef) = { 
    | type F = Function1[_ >: a.type, Unit] 
    | } 
foo: [A](a: A with AnyRef)Unit 

なぜ? 制限の目的は何ですか?

答えて

5

参照:

AnyRef対http://docs.scala-lang.org/sips/pending/42.type.html

いずれかが現在だけAnyRefに準拠して、一定のどのポイント識別子に、いくつかの状況でシングルトン型を使用する可能性があります。この制限は、シングルトン型の等価性検査とパターンマッチングのために使用されるeqメソッドを持たないAnyが原因です。https://github.com/scala/scala/pull/3558。これはメーリングリストherehereで議論されており、これを行う必要があるという同意があります。

+0

なぜそれが_>:a.typeに影響するのかまだ分かりません。私は_>のような実在の型を考えました:a.typeは型の等価チェックには関係しません。 –

+0

私は、セーフガードが適用されたときにコンテキストが考慮されないと仮定します。 Scalaの言語学者の一人が明確になることを願っています。 – devkat

関連する問題