2017-10-03 5 views
0

コンパニオンクラスから継承したオブジェクトの問題については既に読んでいます。例えばデフォルト以外のコンストラクタパラメータを持つスカラクラスシングルトン

しかし、私は次のように持って少し別の問題(私はそれがバグであることを確認していない)

を持っていますコード:

class Scala(name: String) 

import Scala._ 

object Scala extends Scala(TEST_NAME){ 
    val TEST_NAME = "test name" 
} 

コンパニオンオブジェクトのスコープで定義された変数を使用していて、それをスーパーのコンストラクタに渡しています。

class Scala(name: => String) 

import Scala._ 

object Scala extends Scala(TEST_NAME){ 
    val TEST_NAME = "test name" 
} 

名前付き引数:

class Scala(name: String) 

import Scala._ 

object Scala extends Scala(name = TEST_NAME){ 
    val TEST_NAME = "test name" 
} 

コール名によって:私は試してみました

Scala.scala:5: error: super constructor cannot be passed a self reference 
unless parameter is declared by-name 

object Scala extends Scala(TEST_NAME){ 
         ^
one error found 

その他の変種:

私は、次のコンパイルエラーを取得しています

両方Fそれら:

class Scala(name: => String) 

import Scala._ 

object Scala extends Scala(name = TEST_NAME){ 
    val TEST_NAME = "test name" 
} 

いくつかの環境の詳細:

  • のjava:java version "1.8.0_144"
  • のjavac:javac 1.8.0_144
  • スカラ:Scala code runner version 2.12.3
  • scalac:Scala compiler version 2.12.3
  • OS:Darwin ***.local 17.0.0 Darwin Kernel Version 17.0.0: Thu Aug 24 21:48:19 PDT 2017; root:xnu-4570.1.46~2/RELEASE_X86_64 x86_64

アップデート:この解像度に興味がある人のため

+0

私は交際がはい、ここにあなたが交際中の必要がないわけ –

+0

@EduardoParejaTobesを任意の役割を果たしているとは思いませんか? –

+0

でも、これはhttps://stackoverflow.com/q/32203867/614394と似ていますが、値は同じです。私は型には問題ないと思っており、値には間違っていると思います。 –

答えて

0

上記のコードは、あなたが

を書くことができ、コンパイルたい場合
class A(val x: String) 

object B extends A(B.x_again) { 

    val x_again = x 
} 
確かに良く見えない

+0

ええ、私はそれが少し奇妙に見えることに同意します。 –

1

Scala 3:early initializersで削除される不明瞭な機能を使用できます。スーパークラスのコンストラクタを呼び出す前に実行するinitコードを指定することができます。

class Scala(name: String) 

object Scala extends { 
    val TEST_NAME: String = "test name" 
} with Scala(TEST_NAME) { /* rest of object code */ } 

インポートが必要とされていません注 - TEST_NAMEは、スコープ内にすでにあります。


ここには、動作することを証明するためのScastie snippetがあります。

scala> class C(s: String) ; object X extends C(X.x) { final val x = "hello, world" } 
defined class C 
defined object X 

一定の値の定義は(スペックごとに)インライン化されています。あなたの使用制限のケースについて

+0

お返事ありがとうございます。だから私の質問の解決は何ですか?バグですか?エッジケース? –

+0

@AndriiAbramov私は分かりません。私は、名前でパラメータが動作していないバグを呼びますが、メッセージでは(Scalaの古いバージョンがサポートしていればサポートしていますが、今は確認できません)、しかし、 2.10以降は誰も気にしていなかったからです。 –

2

関連する問題