代码之家  ›  专栏  ›  技术社区  ›  jerome

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

  •  1
  • jerome  · 技术社区  · 6 年前

    我想扩大以下课程和同伴

    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 回复  |  直到 6 年前
        1
  •  2
  •   Shankar Shastri    6 年前

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

    在scala 2.10之前, AnyVal 是一种封闭的特质。从scala 2.10开始, 但是,可以定义 任意值 称为“用户定义的值类” 由编译器专门处理。正确定义的用户值类提供了一种方法 通过避免在运行时进行对象分配,以及 用静态方法调用替换虚拟方法调用。

    限制

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

    限制概述

    1. 必须只有一个主构造函数,并且该主构造函数只有一个公共的val参数,该参数的类型不是值类。(从scala 2.11.0中,参数可以是非公共的。)

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

    3. 可能没有嵌套或本地类、特性或对象

    4. 不能定义Equals或HashCode方法。

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

    6. 只能将def作为成员。特别是,它不能将lazy vals、var或vals作为成员。

    7. 不能由其他类扩展。