問題タブ [companion-object]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
937 参照

scala - 型クラスが専用のソース ファイルにないのに、コンパニオン オブジェクトで暗黙的に定義された型クラス インスタンスを Scala が見つけられないのはなぜですか?

以下のソースコードを参照してください。すべてのソース コードは同じパッケージで定義されます。1 つのソース ファイル内ですべてのコードを定義するとShowMain.scalaコンパイル エラーが発生しますが、 およびが で定義されているobject ShowMain場合、コンパイル エラーは発生しません。ShowMain.scalatrait Showobject ShowShow.scala

私の質問: これの原因は何ですか? 私が違反した言語規則は何ですか?

コード例:

コンパイル エラー:

(を含む行の ScalaIDE/Scala 2.11.2 output("hello"))

0 投票する
1 に答える
445 参照

scala - Java からインポートされたクラスのコンパニオン オブジェクトを作成する

いくつかのインポートされた Java 型のコンパニオン オブジェクトを作成して、それらを割り当てるために new を使用する必要がないようにしたいと考えています。タイプ Vector3f は、jMonkeyEngine の com.jme3.math からインポートされます。

私が試したのは:

これをコンパイルすると、エラーが発生します。

エラー:(8, 21) が見つかりません: type Vector3f def apply() = new Vector3f()

を追加するimport com.jme3.math.Vector3fと、おそらく私が見ているものを説明する警告が表示されます。

警告:(3, 22) インポートされた `Vector3f' はパッケージ math のオブジェクト Vector3f の定義により永久に隠されています

Java からインポートされた com.jme3.math.Vector3f またはその他の型のコンパニオン オブジェクトを作成するにはどうすればよいですか?

0 投票する
2 に答える
89 参照

scala - コンパニオン オブジェクトにメソッドが存在することを保証し、それを参照するにはどうすればよいですか?

Listableがケース クラスのコンパニオン オブジェクトに混在することを意図しているこの例を考えてみましょう。したがって、 を呼び出すには、 が定義されたを拡張Writer.gridするコンパニオン オブジェクトが必要です。(たとえば、任意のリストをCSV 形式に変換するとします。)AListable[A]implicit Writer[A]Listable

そして、ここに素朴な実装があります:

これはコンパイルされますが、listable: A実際にはオブジェクトTestを参照し、ケースではクラスを参照しているAため、機能しません。w: Writer[A]TestWriter.grid(Test)

の署名を捨てListableて要求することで、この問題をある程度回避できます。implicit List[A]grid

しかし、私は次のことを好みます:

  1. 予期しない結果を生成する可能性があるような暗黙的な関数は必要ありません。
  2. list他の場所でも使用されるため、wrap に特別なタイプを使用しないでください。
  3. gridメソッドの定義を の外部に保持しますListable

これを機能させるために の署名を作り直すことは可能Writer.gridですか? (またはその他の構造変更)

0 投票する
2 に答える
277 参照

scala - Scala でコンパニオン オブジェクト内でクラスを宣言できますか?

プライベートな不変クラス コンストラクターと、補助コンストラクターが最初のステートメントとして相互に呼び出さなければならないという制約と戦っている間、スコープ内のクラスから他に何もないため、インスタンス化にコンパニオン オブジェクトを使用するように制約されているようです。コンパニオン オブジェクトはメイン コンストラクターにアクセスする必要があります。そのオブジェクトを含むスコープを対象とするプライベート キーワードが必要です。

さて、私の脳は名前生成に弱いので、次のようにクラスをコンパニオン オブジェクト自体の中に配置することで、そのコンパニオン オブジェクトとクラスの両方を囲む名前空間の必要性を救おうとしています。

問題は、Groupofprivate[Group]がオブジェクトを参照するのではなく、クラスを参照することです (余計なものになっています)。

そのコンストラクターをコンパニオン オブジェクト レベルで使用できるようにタグ付けするにはどうすればよいですか?

PS:そのコンパニオンオブジェクトはすでに私に頭痛の種を与えておりcomplexCompute、いくつかのコンストラクターの実装が必要になる可能性のあるクラスをエンスコープすることさえ望んでいたでしょう...

編集:わかりました。タグを追加しているときに、コンパニオン オブジェクトがクラスのスコープに対してなんらかの権限を持っている可能性があることを知らせるニューロンにぶつかりました。プライベート パーツにアクセスできるため、専用の囲みスコープなしでオブジェクトとクラスを並べて配置できます。object Main {object Main {object Main...ただし、このようなボクシング ケースのスコーピングを処理する可能性のある方法についての回答と、コンパニオン オブジェクトを使用せずにクラスにコンストラクターのみを含める手法についての発言の可能性の両方について、質問を維持します。

0 投票する
2 に答える
106 参照

scala - トレイトは、コンパイル時または実行時にコンパニオン オブジェクトによって継承されることを保証できますか?

私は、初期化が本質的にスレッドセーフではないという特性を持っていますが、定義により初期化スレッドセーフ であるコンパニオンオブジェクトのベースとして使用することを厳密に意図しています。

特性が常にコンパニオン オブジェクトによって拡張されることを (コンパイル時または実行時に) 保証する方法はありますか? トレイトには、コンパニオン オブジェクトの初期化中にのみ呼び出されるメソッドがあり、検証のサイトになる可能性があります。