2013-06-23 41 views
2

例如,我有一個增強JavaFX Label類的隱式類。總之:有沒有辦法使用implicits來初始化匿名對象而不重複「this」?

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」。或類似的東西,但我想完全擺脫它。

任何提示讚賞。

柯蒂斯

+2

出於好奇,爲什麼不乾脆讓'EnhanceLabel'延長'Lab​​el'然後讓'l'的,一個匿名實例? –

+0

第一個示例應該編譯,您只需爲超類中的字段賦值,在這種情況下不需要隱式轉換 – 4lex1v

+0

另一個觀察結果是錯誤消息很有用!既爲你和我們。不要在你的問題中說「這不能編譯」;告訴我們它是如何失敗的。強迫自己去看那些會向你展示@AlexIv所說的,關於「文本」是一個已經存在的領域。編譯器知道你實際寫了什麼(而不是你認爲你寫的是什麼),並且是最終的仲裁者。聽聽它說什麼:) –

回答

1

根據給定的代碼,你不是從EnhanceLabel類調​​用text,而是試圖值分配給Labeled類的text領域。此外,由於標記爲類中存在text字段,因此不會引發異常。 Scala嘗試將隱式轉換作爲編譯程序的最後機會。

斯卡拉將EnhanceLabel在以下情況:

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

val l = new Label("Text") 
l.enhanced = "Other text" 
+0

文本可能是一個壞例子,因爲Labeled有一個稱爲文本的私人字段。重點是,這不適用於在隱式類中定義的任何字段或方法。編譯器錯誤說「找不到:值文本」。我真的不認爲它試圖分配到一個私人領域。我的問題的關鍵是如何設置匿名初始化塊而不用「this」。到處都是。 – countfloyd

相關問題