2

例如,我有一个增强 JavaFX Label 类的隐式类。简而言之:

class EnhanceLabel(val l: Label) extends AnyVal {
    def opacity = l.getOpacity
    def opacity_= (d: Double) { l.setOpacity(s) }
}

object EnhanceLabel {
  implicit def enhanceLabel(x: Label) = new EnhanceLabel(x)
}

我正在尝试像这样使用它(在导入隐式 def enhanceLabel 之后):

val l = new Label() {
    opacity = 0.5
}

这不编译。错误信息是:

not found: value opacity
    opacity = 0.5
    ^

我要做:

val l = new Label() {
    this.opacity = 0.5
}

我认为这是因为不透明度设置器来自隐式转换?是否需要“this”来搜索隐式转换?如果它丢失,它不会假设“这个”吗?如果我把它放大很多,我最终会得到无数的“这个”。对我来说似乎多余的关键字。当然,我可以将其缩短为“x”。或类似的东西,但我想完全摆脱它。

任何提示表示赞赏。

柯蒂斯

4

1 回答 1

1

根据给定的代码,您不是text从类中调用,而是尝试为Labeled类的字段EnhanceLabel赋值。此外,此处未使用您的隐式转换,因为Labeled类中有一个字段,不会引发异常。Scala 尝试将隐式转换作为编译程序的最后机会。texttext

Scala 将EnhanceLabel在以下情况下:

implicit class EnhanceLabel(val l: Label) {
  var enhanced = _
}

val l = new Label("Text")
l.enhanced = "Other text"
于 2013-06-23T20:20:07.837 回答