問題タブ [value-class]
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.
scala - scala で特殊な値クラスの効果を得ることができますか?
私は@specialized
クラスと値クラスがどのように機能するかを知っており、次のような特殊な値クラスを持つことはできないことを知っています:
同様の効果を得る方法が見つかりません。単一の宣言で、複数の Java プリミティブに対する純粋な構文ラッパーとして機能するユーザー型/型コンストラクターを作成します。この制限を回避する方法はありますか?
値クラスの背後にある主な動機の 1 つは、ビジネス上の意味を持つ値型に「注釈を付け」、そのデータの型とは異なる型を作成することでした。
ボックス化されたタイプを静的に知っている限り、これは非常にうまく機能しますが、いくつかの異なるプリミティブをミリボルトとして扱いたい場合は、プリミティブごとに新しいラッパーを作成するか、それらが設計されたものにジェネリックを使用するオプションがありますに:
これはすべて甘いもので、実際にof
ラッパーはコンパイル時に削除されますが、残念ながらプリミティブは Java ラッパーにボックス化され、2 つのフィールドは次のようにコンパイルされます。
long
およびint
フィールドではありません。
次のようなコードを書くことは可能ですか?
- 単一の宣言(新しい「ユニット」タイプ)で新しいそのようなラッパーを作成できます。
- 少なくとも基礎となるプリミティブ (ミリボルトで動作するメソッド、ボックス化されたプリミティブからの抽象化) に関して、そのようなラッパーで一般的な操作を実行します。
- ラッパー型と基になるプリミティブ型の両方が完全にインスタンス化され (ジェネリック型の型パラメーターではない)、呼び出されたメソッドをインライン化できる場合は、ボクシングを実行しません (したがって、現在および将来のすべてのユニットに対して追加を 1 回定義できます)。
- 理想的には、クライアント コードのマクロに依存しません (型宣言自体が IDE で理解できる限り、実装での使用は問題ありません)。
scala - 値クラスのファクトリメソッドをインライン化しないのはなぜですか?
検討:
(2.11.7) でscalac -feature -Xprint:all Playground.scala
コンパイル
実際、次のjavap -v -private Playground
ことを示しています。
Playground コンストラクターを次のように変更する場合:
1
両方とも、期待どおりにリテラルの割り当てを示しw
ています。率直に言って、この発見にはかなりがっかりしています。これは、値クラスを使用した型レベルのプログラミングを実質的に妨げているからです (一時的な値クラスのインスタンスは、単純なインライン メソッドのチェーンによって作成されます)。
scala - オブジェクト型としての scala 型パラメーター
どうすればこれを達成できますか:
その状況でコンパニオン オブジェクトを定義したくありません。暗黙を使用してオブジェクトを拡張する機会があるかどうか疑問に思いましたか?
私がそうするとき (私は TypeObject として TO を使用し、TypeClass 命名として TC を使用します)、idFn[TO, TC]
TO を実装するオブジェクトにしたいのですが、def apply(id: String): TC
それを強制できますか? また、この機能を使用するにはどうすればよいですか? 型パラメーターで関数を呼び出すことはまったく不可能だと感じています:/
scala - Java から Scala の値クラスを使用する
実行時のボクシングを避けるために、Scala で値クラスを使用しています。
例えば。:
ただし、Java コードから同じ値クラスを使用しています。
ThingId
実際には Long としてコンパイルされるため、これは機能しません。
Java から値クラス (または役立つラッパー/ヘルパー) を使用するパターンはありますか?