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)
}

私は次のように使用しようとしています(暗黙のdefEnhanceLabelをインポートした後):

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

これはコンパイルされません。エラーメッセージは次のとおりです。

not found: value opacity
    opacity = 0.5
    ^

私がしなければなりません:

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

これは、不透明度セッターが暗黙的な変換によるものだからだと思いますか? 暗黙的な変換を検索するには、「これ」が必要ですか? 欠落していると「これ」と見なされませんか?これを大きくスケールアップすると無数の「これ」になってしまいます。私には冗長に思えるキーワード。もちろん、「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 に答える