何か、おそらくマクロを実装して、次のようなものを実装したいと思います
Int --> java.lang.Integer
Float --> java.lang.Float
次のようなものを実装できるように
def box[X <: AnyVal : Numeric](x: X) : Boxed[X] = ...
インスタンス化すると、 になりBoxed[Int]
ます。java.lang.Integer
上記のような型でアドホック マッピングを実行できるジェネリック メソッドとクラスを記述できる限り、特定の構文や実装方法にはあまり関心がありません。Scala ライブラリには、ボックス化とボックス化解除のための int2Integer のような暗黙の関数が既にあることは知っていますが、コンパイラが型チェックできるように型を明示的にマップする必要があります。これは主に、インスタンスが型パラメーターに依存するが非パラメトリックな方法で型メンバーを持つ型クラスを実装するためのものです。現在、型パラメーターから計算するのではなく、型クラスの各インスタンスでこの型メンバーを明示的に定義していますが、それはすべてのインスタンスにボイラープレートを追加します
編集
上記の関数は単なる例です。本当に私は次のようなことを言う必要がある型クラスを書いています:
trait Mapping[T, U] {
type MapBase = java.util.Map[Box[T], Box[U]]
type MapType <: MapBase
def create : MapType
...
}
Box[T] は上記のように動作します。これは、FastUtil や Trove などの特殊な Java コレクション ライブラリとのインターフェイスを意図しています。型クラスのインスタンスMapType
は特殊なクラスにインスタンス化されるため、
暗黙的なオブジェクト LongIntMapping extends Mapping[Long, Int] { type MapType = Int2LongOpenHashMap def create : MapType = ... }
ボックス化されていないプリミティブを格納している場合でも、MapBase = Map[java.lang.Long, Java.lang.Integer]
FastUtil が実装するインターフェイスであるため、自動的に取得する必要があります。Int2LongOpenHashMap
これは FastUtil の一般的なパターンです。ネイティブ型のコレクションは、対応するボックス化された型の Java コレクション インターフェイスを実装します。これが、私が体系的に実装しようとしている概念です。もちろん、これには、使用する FastUtil コレクションごとに typeclass インスタンスが必要です。この問題を解決/軽減するためにマクロも検討しています。Mybe マクロは型クラスの必要性さえ回避しますが、本番コードと実験的なマクロのためのものです...