Scala passt nicht zu java.lang.String und Case Class

8

Hallo Kollegen Scala Programmierer

Ich arbeite seit ein paar Monaten mit Scala zusammen, aber ich habe ein Problem mit einigen grundlegenden Dingen, ich hoffe, du wirst mir dabei helfen.

%Vor%

Wenn ich so etwas mache, bekomme ich einen Fehler:

%Vor%

Und wenn ich dann die zweite Zeile in dem Muster passend zu folgendem ändere:

%Vor%

Ich bekomme dann den Fehler:

%Vor%

Wenn ich jedoch die String-Definition in den folgenden ändern, kompiliert es in beiden Fällen.

%Vor%     
Stefan 16.04.2010, 09:53
quelle

4 Antworten

21

Der abgeleitete Typ der Zeichenfolge ist String. Das ist nach der Deklaration des Val bekannt.

Wie wir bereits beim Pattern-Matching wissen, ist es nicht sinnvoll, Patterns zu finden, die keine Strings sind (wie Ihre PersonClass), da sie niemals übereinstimmen. Das ist, was der "Muster-Typ ist nicht kompatibel mit erwarteten Typ; gefunden: Objekt PersonClass erforderlich: java.lang.String Fall PersonClass = & gt; println (String)" bedeutet: Wir erwarten ein Muster, das eine Unterklasse von String ist, aber etwas gefunden (PersonClass) was nicht ist.

Wenn Sie den Typ AnyRef erzwingen, ändert sich die Situation. Der Compiler behandelt die Zeichenfolge als Anyref, sodass Muster, die AnyRef erweitern, übereinstimmen. PersonClass ist AnyRef, daher erhalten Sie keinen Fehler.

    
Sandor Murakozi 16.04.2010, 10:43
quelle
8

Wenn Sie bereits ein Objekt vom Typ String haben, wird es nie mit einem Typ PersonClass übereinstimmen. Es ist tatsächlich eine Funktion, die der Compiler nicht erlaubt, diese Übereinstimmungen auszuführen, die niemals erfolgreich sein werden.

Mit dem Any-Typ schalten Sie einfach den Typprüfung aus. Es wird nicht mit dieser Definition übereinstimmen, aber der Compiler kann dieses Problem nicht finden.

    
Thomas Jung 16.04.2010 10:41
quelle
5

Ich nehme an, Sie versuchen, etwas anderes zu testen, aber der Compiler ist zu schlau, um Sie zu lassen.

Vielleicht möchten Sie so etwas:

%Vor%

Aber wie andere darauf hingewiesen haben, wird der Compiler, wenn Sie nicht wirklich nach den anderen Typen suchen müssen, sich darüber beschweren, dass das, was Sie tun, sinnlos ist. Eine gute Sache auch: Wenn Sie keinen Test schreiben, haben Sie möglicherweise einen schwer zu debuggenden Laufzeitfehler.

    
Rex Kerr 16.04.2010 14:21
quelle
0
%Vor%     
Achraf Arboun 27.12.2013 17:10
quelle