2012-06-13 15 views
7

Ich habe einige Scala-Code, der existentielle Typen verwendet, die ich auf 2.10 aktualisieren, und ich bemerkte eine Warnung über "import language.existentials", die mich denken, dass es eine bessere Möglichkeit zum Schreiben geben sollte Dies. Der Code, den ich habe läuft darauf hinaus:Idiomatische Ersatz für existentielle Typen

class A { 
    private var values = Set.empty[(Class[_], String)] 
    def add(klass: Class[_], id: String) { 
    val key = (klass, id) 
    if (!values(key)) { 
     values += key 
     // More logic below.. 
    } 
    } 

ich diese Warnung:

[warn] test.scala:4 inferred existential type (Class[_$2], String) forSome { type _$2 }, which cannot be expressed by wildcards, should be enabled 
[warn] by making the implicit value language.existentials visible. 
[warn] This can be achieved by adding the import clause 'import language.existentials' 
[warn] or by setting the compiler option -language:existentials. 
[warn] See the Scala docs for value scala.language.existentials for a discussion 
[warn] why the feature should be explicitly enabled. 
[warn]  val key = (klass, id) 

Gibt es eine Möglichkeit ich meinen Code nicht diese Warnung generieren neu schreiben kann (oder den Import erforderlich ist), oder ist das die idiomatischste Art, es auszudrücken? Ich frage nie irgendwo im Code nach dem Typ-Parameter der Klasse.

Antwort

8

Die Warnung ist über die Schlussfolgerung des existentiellen Typs, die normalerweise unerwünscht ist. Fügen Sie entweder die import-Anweisung hinzu oder machen Sie sie explizit:

val key: (Class[_], String) = (klass, id) 
+0

Entschuldigung, ich verstehe den Punkt nicht. Warum ist der abgeleitete Typ gefährlich oder unerwünscht? Der Parameter in der Klasse spielt keine Rolle, es macht fast nichts, wenn man mit Klassen und Reflektion zu tun hat (da er gelöscht wird und somit wertlos ist, wenn man gezwungen wird, die Klasseninformationen zu betrachten oder zu benutzen). Warum sollen wir gezwungen sein, eine überflüssige Typendeklaration für etwas so Klares und Einfaches wie den Schlüssel in diesem Fall zu schreiben? Es gibt * eine Typdeklaration in einer Zeile, also wo ist das Problem? – Ichthyo

+0

lassen Sie mich klarstellen: Ich bin mir bewusst, dass Sie sehr komplizierte und verwirrende Sachen mit der vollen Syntax für existenzielle Typen bauen können. Aber in diesem Fall, wo ist das Problem oder die Gefahr? 'Klasse [_]' scheint angemessen – Ichthyo

+0

@Ichthyo, die möglicherweise für Klasse gelten, aber eine existentielle Liste ist nicht annähernd so nützlich, zum Beispiel. Der Typparameter auf Class ist meistens nutzlos, weshalb existentiell damit keine große Sache ist. –

4

Wenn Sie einen Typparameter für die add-Methode angeben, wird die Warnung gelöscht. Dies hat keinen Einfluss darauf, was in den var-Werten gespeichert werden kann. Ich habe keine gute Antwort, aber es ist ein Workaround. Hoffentlich wird jemand, der fähig ist, auch mit einer Erklärung antworten.