Scala, Erweitern Gegenstand mit einem Allgemeinen Merkmal
Ich bin mit Scala und ich möchte verlängern ein (singleton -) Objekt mit einer Eigenschaft, die liefert eine Daten-Struktur und einige Methoden, wie diese:
trait Tray[T] {
val tray = ListBuffer.empty[T]
def add[T] (t: T) = tray += t
def get[T]: List[T] = tray.toList
}
Und dann werde ich würde gerne mischen-in der Eigenschaft in einem Objekt, wie diesem:
object Test with Tray[Int]
Aber es gibt Unterschiede in der Art add
und get
:
Test.add(1)
//...
Wie kann ich erhalten, um zu arbeiten? Oder was ist mein Fehler?
InformationsquelleAutor Themerius | 2012-12-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie sind shadowing das Merkmal ' type-parameter mit der
T
auf dieadd
undget
Methoden. Siehe meine Antwort hier für mehr Details über das problem.Hier ist der richtige code:
Beachten Sie die Verwendung von
extends
in der Objekt-definition—siehe Abschnitt 5.4 die Skillung für eine Erklärung, warumwith
allein funktioniert hier nicht.Ich bin mir nicht sicher, ich verstehe genau was du meinst, aber das problem ist eigentlich ziemlich einfach—Sie können sich vorstellen, eine neue Typ-name in einer Methode den Typ-parameter-Liste, die buchstabiert das gleiche wie ein bestehender Typ name außerhalb der Methode. Sie können genau das tun die gleiche Sache in Java.
Sicher, es ist ein Umfang Sache. Daher ist es mehr ein feature. 🙂
InformationsquelleAutor Travis Brown