2013-06-25 92 views
4

實質上類似於subtle differences between val and def的問題。我不知道什麼是有一個成員單獨的對象之間的語義差別:val和singleton對象之間有什麼細微差別?

class Text { 
    ... 
    object Whitespace { def unapply(s :String) = 
     if (s.forall(_.isWhitespace)) Some(s) else None 
    } 
} 

class Text { 
    ... 
    val Whitespace = new { def unapply(s :String) = 
     if (s.forall(_.isWhitespace)) Some(s) else None 
    } 
} 

我知道如何都轉換爲字節碼,但我能在代碼中有一個這樣做,我可以」與另一個?

+0

我會讓別人更充分的評論,但第二個使用反射來調用'unapply'!避免! (如果你只是覆蓋現有的方法或者實現一個抽象的方法,但是通過反射調用任何_new_方法,那很好,幸運的是,編譯器會警告你。) –

+0

[Scala - new vs object extends] //sacklare.com/questions/16182735/scala-new-vs-object-extends) –

+0

@RégisJean-Gilles我不同意。在你引用的問題中,所需的值擴展了一個給定的類,沒有額外的成員。在這裏,OP想要定義新成員(顯然這是看Rex評論的一個問題)。 – gzm0

回答

3

您需要更努力才能覆蓋成員對象。

[email protected]:~/tmp$ skala 
Welcome to Scala version 2.11.0-20130622-103744-990c2b024a (OpenJDK 64-Bit Server VM, Java 1.7.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Foo1 { val foo =() => 1 } 
defined class Foo1 

scala> class Bar1 extends Foo1 { override val foo =() => 2 } 
defined class Bar1 

scala> class Foo2 { object foo { def apply() = 3 } } 
defined class Foo2 

scala> class Bar2 extends Foo2 { override object foo { def apply() = 4 }} 
<console>:8: error: overriding object foo in class Foo2; 
object foo cannot override final member 
     class Bar2 extends Foo2 { override object foo { def apply() = 4 }} 
               ^

scala> :q 
[email protected]:~/tmp$ skala -Yoverride-objects 
Welcome to Scala version 2.11.0-20130622-103744-990c2b024a (OpenJDK 64-Bit Server VM, Java 1.7.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Foo2 { object foo { def apply() = 3 } } 
defined class Foo2 

scala> class Bar2 extends Foo2 { override object foo { def apply() = 4 }} 
defined class Bar2 

scala> new Bar2 
res0: Bar2 = [email protected] 

scala> .foo() 
res1: Int = 4 

scala> :q 
相關問題