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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top