研究プロトタイプでは、プリミティブなScalaデータ型(例:Double
)を追加フィールドで拡張したいと考えています。これは、scala.Double
とscala.runtime.RichDouble
がfinal
と宣言されているため、すぐに使用することはできません。カスタムスカラライブラリを構築してプリミティブデータ型を拡張する
これは私が試したものです:antを使用して
クローンScalaのリポジトリ
をクラス
scala.runtime.RichDouble
からfinal
修飾子を削除したファイルでsrc/library/scala/runtime/RichDouble.scala
コンパイルスカラ:
ant build-opt
お客様作成
RichDouble
拡張OMクラス:カスタムコンパイルスカラ座を使用して$ echo "class MyDouble extends scala.runtime.RichDouble {}" > MyDouble.scala
コンパイル
MyDouble.scala
:$ build/pack/bin/scalac MyDouble.scala
これは、しかし、次のエラーで結果:
で実行MyDouble.scala:1: error: illegal inheritance from final class RichDouble class
、scala-library.jar
をコンパイルしたカスタムは確かにロードされている:
$ strace -f ./build/pack/bin/scalac MyDouble.scala 2>&1 | grep scala-library
stat("/my/custom/dir/scala/build/pack/lib/scala-library.jar", {st_mode=S_IFREG|0664, st_size=5682113, ...}) = 0
私は何をしないのですか?なぜ修飾子を削除したにもかかわらず、クラスRichDouble
はまだfinal
と報告されていますか?
Florian、明白な疑問は、あなたが "豊かな"型が標準値クラスから継承しなければならない理由です。 'BigInt'や、あなたの" rich "型が実際に' Number'のようないくつかの特性/インタフェースを実装する普通のクラスである他の同様の型のために使われるアプローチを使わないのはなぜですか? – SergGr
ちょっと、いい点ですが、これについては言及していませんでした。実際にはRichDoubleなどを使用するSparkフレームワークと統合しています。既存のコードベースの大部分を変更したくないです。 – Florian
さて、あなたは運が悪いと思う。 Sparkは性能上の理由から標準値型を使用していると思います。 'Float'や' Double'のような型の場合、すべての標準演算は、(インタフェースを介して)いくつかのメソッドのはるかに高価な呼び出しではなく、ただ1つのASM命令で解釈されることが保証されます。 – SergGr