2017-10-31 2 views
1

I scala Version 2.12.3 verwenden, und wenn ich einige Muster Spiel in Konsolen Code testen:Scala Typ Löschung in Pattern-Matching-Map [String, ANY]

val d: Any = Map("1" -> "2", "3" -> 4) 
d match { 
    case map: Map[String, Any] => println(map) 
    case _ => println("should not be here") 
} 

Ich habe einige Warnung wie <console>:14: warning: non-variable type argument String in type pattern scala.collection.immutable.Map[String,Any] (the underlying of Map[String,Any]) is unchecked since it is eliminated by erasure.

Ich hatte über die Warnung gegoogelt, und fast alle Antworten werden gesagt, dass scala Laufzeit den Typ löscht, wenn Muster übereinstimmen, und es scheint vernünftig zu sein, die Frage zu beantworten, aber wenn ich den folgenden Code verwende:

Es gibt keine Warnung über Typ löschen, also was ist der Unterschied zwischen diesen beiden Arten von Mustererkennung, und erklären Sie bitte, wenn der Typ löschen wird passieren, danke!

+0

Warum zuerst das 'Any' Problem? – cchantep

+0

@cchantep Ich führe das 'Any' Problem zuerst ein, weil ich mich sehr verwirrt über den Typ des Löschens der Mustererkennung fühle, der zweite Codeblock lässt mich ein wenig zweifelhaft für die Laufzeit Type Erase werden. – kemiya

+0

Besser, das erste Problem zu beheben, anstatt zu versuchen, Abhilfe zu schaffen, als Folge davon, die Typsicherheit zu verlieren – cchantep

Antwort

1

Das Problem mit der Übereinstimmung : Map[String, Any] ist, dass es nur tatsächlich möglich ist zu überprüfen, Sie haben eine Map zur Laufzeit. So z.B.

val d: Any = Map(0 -> 0) 
d match { 
    case map: Map[String, Any] => println(map) 
    case _ => println("should not be here") 
} 

Die Übereinstimmung ist erfolgreich und die Karte wird gedruckt. Im zweiten Fall ist der statische Typ e bereits Map[String, Any]. Der Compiler "weiß" also, dass Sie keinen anderen Typ von Map erhalten können, und es gibt kein Problem, vor dem Sie warnen sollten.

Aber Typ Löschung noch passiert. Und es bedeutet, dass Sie tatsächlich können etwas anderes als ein Map[String, Any] in e bekommen, aber nur durch den Compiler in irgendeiner Weise lügen oder andere Warnungen ignorieren. In diesem Fall ist die Übereinstimmung immer noch erfolgreich. Z.B.

val e = Map(0 -> 0).asInstanceOf[Map[String, Any]] 
e match { 
    case map: Map[String, Any] => println(map) 
    case _ => println("should not be here") 
} 
0

Diese in Programming in Scala erklären Sie

Zum ersten Mal eine Warnung erhalten, da d zu einer Art Alle gezwungen wird. Der zweite Mal-Compiler leitet den Typ von e als Map [String, Int] ein, was im ersten Fall der Ausdruck des Musters ist. Compiler kennt den Typ zur Kompilierzeit, also nichts, worüber man warnen kann.

Verwandte Themen