2009-06-23 8 views
3

Ich habe das folgende Problem, vielleicht kann mir jemand helfen (oder erklären, wo mein Fehler ist). Gegeben sind ein Merkmal und eine Klasse:Geben Sie Probleme mit Java-Klassen

trait TextAttr[T <: {def setText(s:String); def getText : String}] { 
    val obj : T 
    def txt_= (s:String) = obj.setText(s) 
    def txt = obj.getText 
} 

class ScalaText { 
    private var t = "" 
    def setText(s:String) = t = s 
    def getText = t 
} 

Jetzt erstelle ich eine neue Klasse mit beiden von ihnen:

class ScalaTextUser extends TextAttr[ScalaText] { 
    override val obj = new ScalaText 
} 

Das ist okay. Aber wenn ich so etwas mit der Klasse org.eclipse.swt.widgets.Text (oder einer anderen reinen Java-Klasse) erstellen möchte, bekomme ich einen Fehler. Hier ist der Code:

class SwtTextUser(parent:Composite) extends TextAttr[Text] { 
    override val obj = new Text(parent, 0) 
} 

Und das ist der Fehler:

Typ Argumente [org.eclipse.swt.widgets.Text] entsprechen nicht TextAttr den Typ Parametergrenzen [T < Merkmal: AnyRef {def setText (String): Einheit; def getText: String}]

Hat jemand eine Idee?

Danke, Chris.

+0

Einfach überprüfen, aber ist die Zeichenfolge in Scala die gleiche wie java.lang.String? –

Antwort

2

Versuchen Sie, die Eigenschaft Erklärung an die folgende Veränderung:

trait TextAttr[T <: {def setText(s: String); def getText(): String}] { 

Scala hat eine subtil unterschiedliche Behandlung für Methoden mit und ohne Klammern. Fügen Sie im Zweifelsfall die Parens hinzu und lassen Sie den Compiler die Dinge sortieren.