Ich habe versucht, einen Typalias für den abhängigen Typ _ >: a.type
zu erstellen.Warum verbietet Scala-Compiler die Deklaration eines Wildcard-Typs als Super-Typ eines Typparameters
Der Scala-Compiler einen Fehler meldet, die ich nicht verstehe:
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]
^
Wenn ich a: A
zu a: A with AnyRef
ersetzen, es funktioniert:
scala> def foo[A](a: A with AnyRef) = {
| type F = Function1[_ >: a.type, Unit]
| }
foo: [A](a: A with AnyRef)Unit
Warum? Was ist der Zweck der Beschränkung?
Ich verstehe immer noch nicht, warum es wirkt _>: a.type. Ich dachte, ein existentieller Typ wie _>: a.type würde nie an der Typgleichheitsprüfung beteiligt sein. –
Ich gehe davon aus, dass der Kontext bei der Anwendung der Schutzmaßnahme nicht berücksichtigt wird; Lasst uns hoffen, dass einer der Scala Sprachgurus klären wird. – devkat