2013-12-20 5 views
5

Wenn ich eine Klasse zu schreiben versucht, die jede Class[_] als Parameter akzeptiert:Wo ist das Scaladoc für scala.language.existentials?

case class A(klass: Class[_]) 

ich diesen Fehler habe:

test.scala:1: warning: inferred existential type Option[Class[_$1]] forSome { type $1 }, which cannot be expressed by wildcards, should be enabled by making the implicit value scala.language.existentials visible. This can be achieved by adding the import clause 'import scala.language.existentials' or by setting the compiler option -language:existentials. See the Scala docs for value scala.language.existentials for a discussion why the feature should be explicitly enabled. case class A(klass: Class[]) ^one warning found

Ich bin bereit, zu wissen, warum es nicht funktioniert. Aber wo ist "Scala docs for value scala.language.existentials"? Ich habe "scaladoc scala.language.existentials" gegoogelt, aber einige Threads bekommen, die ich nicht verstehen kann.

Klarstellung: Ich weiß, dass die ‚richtige‘ Art und Weise, eine solche Klasse zu implementieren ist:

case class A[T](klass: Class[T]) 

Aber ich möchte wissen, was bedeutet, dass die Warnmeldung.

Antwort

4

In diesem Fall, was Sie suchen, ist ein ClassTag:

class A[T](implicit val tag : reflect.ClassTag[T]) 

Dies Ihnen das ClassTag Objekt für den generischen Parameter gibt, die Sie Class gegeben zugreifen können, wenn Objekte erstellt werden.

Was Existenziale können Sie überprüfen:

+0

Ich verstehe es nicht. Meine 'Fallklasse A [T] (klass: Class [T])' funktioniert gut. Was ist der Vorteil von 'ClassTag'? –

+1

@ LaiYu-Hsuan, wenn Sie 'Klasse A [T: ClassTag]' schreiben (es ist dasselbe wie in der Antwort), können Sie diese Klasse wie folgt erstellen: 'new A [String]', nicht so: 'new A (classOf [String])', weil der Compiler automatisch den Wert 'ClassTag' liefert. Es ist der idiomatische Ansatz, eine Laufzeitklasse für eine Typvariable zu erhalten. Und Sie können 'Class [_]' immer aus 'ClassTag [T]' abrufen. –

+0

Es macht Sinn. Danke für die Antwort. –

4

Heather Miller nur auf scala-Benutzer erklärt, dass Sie den linken Bereich der Suche verwenden für "Sprache" und dann die Suche im rechten Fenster nach existentiell, da der linke Bereich keine Mitglieder hat.

Wenn Sie eine Diskussion finden, die Sie nicht verstehen, dann wissen Sie, dass Sie am richtigen Ort sind.

1

Ich hatte die gleiche Frage und ich traf diesen SO-Thread; Keine der Antworten ist eine direkte Antwort auf die Frage, also füge ich sie unten hinzu. Die Scala-Dokumente für den Wert scala.language.existentials sind wahrscheinlich in den JavaDoc-Kommentaren enthalten, die folgenden Status haben: