例如,我有一个增强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”。或类似的东西,但我想完全摆脱它。
任何提示都表示赞赏。
柯蒂斯
答案 0 :(得分:1)
根据给定的代码,您不是从text
类调用EnhanceLabel
,而是尝试将值分配给Labeled类的text
字段。此处也未使用隐式转换,因为 Labeled 类中存在text
字段,不会引发异常。 Scala尝试将隐式转换作为编译程序的最后机会。
Scala将EnhanceLabel
在以下情况中:
implicit class EnhanceLabel(val l: Label) {
var enhanced = _
}
val l = new Label("Text")
l.enhanced = "Other text"