关于ant:构建并使用自定义scala库来扩展原始数据类型

Build and use custom scala-library to extend primitive datatypes

对于研究原型,我希望能够使用其他字段扩展原始Scala数据类型(例如Double)。这是不可能的,因为scala.Doublescala.runtime.RichDouble被声明为final

这是我尝试过的:

  • 克隆scala存储库

  • 从文件src/library/scala/runtime/RichDouble.scala

    中的类scala.runtime.RichDouble中删除final修饰符

  • 使用ant编译Scala:ant build-opt

  • 创建一个扩展RichDouble

    的自定义类

    $ echo"class MyDouble extends scala.runtime.RichDouble {}" > MyDouble.scala

  • 使用自定义编译的scala编译MyDouble.scala

    $ build/pack/bin/scalac MyDouble.scala

  • 但是,这将导致以下错误:

    MyDouble.scala:1: error: illegal inheritance from final class RichDouble class

    strace一起运行时,确实正在加载自定义编译的scala-library.jar

    1
    2
    $ 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


    我试图做的事是不可能的。诸如Double之类的原始类型被实现为值类,它们隐式地为final。因此,不能扩展它们是它们的基本限制之一。


    您可以看一下隐式类:它们是为扩展封闭类而设计的。

    1
    2
    3
    4
    5
    implicit class MyDouble(d: Double) {
      def myNewFeature() = println("MyDouble is $d")
    }
    val d1 = new Double(42) // just instantiate a Double
    d1.myNewFeature() // scala will do implicit conversion