用构造函数和伴随对象扩展类

时间:2018-06-27 14:22:58

标签: scala

我想扩展以下课程和同伴

object MyData { // code inside }
class MyData(val data: Struct) extends AnyVal { // code inside }

但是尝试执行此操作时出现Illegal inheritance from value错误

class MyDataExtended(override val data: Struct) extends MyData(data)

1 个答案:

答案 0 :(得分:2)

来自:http://docs.scala-lang.org/overviews/core/value-classes.html

在Scala 2.10之前,featured是一个密封的特征。从Scala 2.10开始,  但是,可以定义AnyVal的子类,称为“用户定义的值类” 编译器专门对其进行处理。正确定义的用户值类别提供了一种方法 通过避免在运行时分配对象以及通过以下方式提高用户定义类型的性能: 用静态方法调用替换虚拟方法调用。

限制

值类当前有一些限制,部分原因是JVM本身不支持值类的概念。有关值类的实现及其限制的完整详细信息,请参见SIP-15。

限制摘要

  1. 必须仅具有一个主要构造函数,该构造函数仅具有一个公共的val参数,其类型不是值类。 (从Scala 2.11.0开始,该参数可能是非公开的。)

  2. 可能没有专门的类型参数。

  3. 可能没有嵌套或局部的类,特征或对象

  4. 可能未定义equals或hashCode方法。

  5. 必须是顶级类或静态可访问对象的成员。

  6. 只能具有def作为成员。特别是,它不能具有惰性val,var或val作为成员。

  7. 不能被另一个类扩展。