Problemas de tipo con clases nativas de Java
Pregunta
Tengo el siguiente problema, tal vez alguien pueda ayudarme (o explicarme dónde está mi error es). Se dan un rasgo y una clase:
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
}
Ahora creo una nueva clase usando ambos:
class ScalaTextUser extends TextAttr[ScalaText] {
override val obj = new ScalaText
}
Eso está bien. Pero si quiero crear algo así con la clase org.eclipse.swt.widgets.Text (o cualquier otra clase pura de Java) Me sale un error. Aquí el código:
class SwtTextUser(parent:Composite) extends TextAttr[Text] {
override val obj = new Text(parent, 0)
}
Y este es el error:
Los argumentos de tipo[org.eclipse.swt.widgets.Text] no se ajustan al tipo de rasgo TextAttr límites de parámetros [T < ;: AnyRef {def setText (String): Unit; def getText: String}]
¿Alguien tiene una idea?
Gracias, Chris.
Solución
Intente cambiar la declaración de rasgos a lo siguiente:
trait TextAttr[T <: {def setText(s: String); def getText(): String}] {
Scala tiene un tratamiento sutilmente diferente para métodos con y sin paréntesis. En caso de duda, agregue los parens y deje que el compilador resuelva las cosas.