Wie man Typ-Constraints für höher-geknotete Typen ausdrückt

8

Ich versuche, eine Liste einiger Merkmale zu erstellen, die durch einen Typ unter Verwendung des CRTP parametrisiert sind, und kann nicht herausfinden, wie die Typabhängigkeiten ausgedrückt werden sollen. Hier ist ein Beispielcode, der das Problem veranschaulicht:

%Vor%

Hier versuche ich eine Liste von Objekten zu erstellen, die dem B-Merkmal entsprechen. Dieser Code wird jedoch nicht kompiliert und gibt den folgenden Fehler:

  

Arten der Typargumente (B) stimmen nicht mit den erwarteten Arten der Typparameter (Typ X) überein. Die Typparameter von B stimmen nicht mit den erwarteten Parametern von Typ X überein: Typ Y's Grenzen & gt ;: Nichts & lt ;: A [Y] sind strenger als Typ _ erklärte Grenzen & gt ;: Nichts & lt ;: Z fürSome {Typ Z & lt ;: A [Z ]} val myList = emptyList [B] ()

Für mich scheint _ <: Z forSome { type Z <: A[Z] } in der Tat mindestens so streng wie Y <: A[Y] zu sein, aber vielleicht fehlt mir etwas.

Die Frage ist also - was sollten die Einschränkungen für die emptyList-Funktion sein, um B korrekt zu behandeln?

    
fhusb 02.11.2012, 11:16
quelle

1 Antwort

4

Nach ein paar Versuchen habe ich es zum Laufen gebracht. Anmerkung: Der Compiler sagt uns, dass die Typparameter in A [+ X] und B [+ Y] kovariant sein müssen.

%Vor%     
Kipton Barros 03.11.2012, 21:07
quelle

Tags und Links