2017-01-02 7 views
1

に適用オーバーライドすることはできません私は、次のコードを持っている:Scalaのケースクラスとコンパニオンオブジェクトは、差分署名

case class Foo(x:Int) { 
    def this(x: Int, y: Int) = this(x + y) 
} 

object Foo { 
    def apply(x: Int, y: Int) = new Foo(x, y) 
} 

を私はコンパイルエラーを受信:Error:Person is already defined as (compiler-generated) case class companion object Person このコードが原因applyが持っているという事実に働かなければなりません別の署名。おそらくそれはスカラのバグです。私のscalaバージョンは2.11.8です。

答えて

2

これにはオープンバグがあります(SI-3772)。 Scala 2.12.2(here is the pull request which fixes it)で修正する必要があります。

あなたが最初のスコープでobjectを定義したが、その後、あなたのthis(x, y)コンストラクタは仲間apply方法シャドウイングされる場合は、この問題を回避することができます

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

object Foo { 
    def apply(x: Int, y: Int): Foo = { 
    println("in new apply") 
    new Foo(x, y) 
    } 
} 

case class Foo(x: Int) { 
    def this(x:Int, y:Int) = this(x+y) 
} 

Foo(1,1) 

// Exiting paste mode, now interpreting. 

in new apply 

をしかし、それはあいまいさを作成し、私はそれを使用していないだろう。

+0

このバグはなぜ早く修正されなかったのですか?重大な欠陥のようですか? – pacman

+0

@pacmanそれは単に優先順位付けされていませんでした。この問題を部分的に回避することができますので、私の更新を参照してください。 –

関連する問題