【问题标题】:What is the meaning of >: Null <: in Scala?>:Null <:在Scala中是什么意思?
【发布时间】:2013-08-05 22:48:59
【问题描述】:

我搜了很多,但没有找到,这种type declaration在Scala中是什么意思?

type Ident >: Null <: AnyRef

【问题讨论】:

    标签: scala


    【解决方案1】:

    关键字type 用于类型别名声明,就像valdef 用于值和方法声明一样。在这种情况下,它是一个带有约束的抽象类型别名,因此它是某些 traitclass 的类型成员 - 本地范围内的类型别名不能是抽象的,也不能有约束。

    类型IdentAnyRef 的子类型和Null 的超类型。

    AnyRef

    AnyRef 是所有引用类型的祖先,除了IntLongChar 等(Java 原语)之外的所有类型。

    Null 是所有“可空”类型的子类型。实际上它是所有引用类型的子类型。

    由于所有AnyRef 都可以为空,因此&gt;: Null 的唯一附加约束是Ident 不是Nothing

    Scala’s type hierarchy:

    【讨论】:

    • 一个快速的后续问题(因为我很好奇),这里的下限不是多余的吗?由于Null 是所有引用类型的子类型,并且该类型的上限已经定义为任何引用类型
    • @PatrykĆwiek:我想是的。但是Null 类型可以作为明确的警告被提及,该值可能是null
    • @Pooya 这不是一个命令,而是一个简单的约束,它告诉 Scalac 这种类型的值有 Null 作为它的子类型
    • @PatrykĆwiek: &gt;: Null Ident 不能是Nothing
    • @Pooya:您可以使用 null 作为任何引用类型的值 (AnyRef):null: String&gt;: Null这里的意思是Ident不能是Nothing
    【解决方案2】:

    补充@senia 的答案:这不是一个type 声明,这是一个抽象类型成员 声明,可以在类似

    的上下文中找到
    trait Foo { // or perhaps class
      type Ident >: Null <: AnyRef
    }
    

    并且意味着Foo 的任何具体实现都必须将某个类型定义为Ident,并且该类型必须满足@senia 的答案中描述的约束。

    【讨论】:

    • 是的,这个类型定义在一个特征中
    【解决方案3】:

    在您的情况下,NullIdent 的子类型,AnyRef 是它的超类型。在没有这个界限的情况下,所有类型的公共子类型是Nothing,但你指定它是Null,当Nothing 是所有对象的子类型(包括Int、Long 等)时,with 是所有对象的子类型。

    类型系统中使用了 Null 和 Nothing 之类的东西,基本上是在类型(Contra/Co)方差中。示例:

    sealed trait Container[+A >: Null <: AnyRef]
    case class Full[A >: Null <: AnyRef](value: A) extends Container[A]
    case object Empty extends Container[Null]
    

    这编译得很好:

    val c: Container[String] = Full("String")
    val e: Container[String] = Empty
    

    但这失败了,因为我们的下限是 Null 而上限是 AnyRef:

    val ff: Container[Int] = Full(10)
    val f: Container[Int] = Empty
    

    我们不能把Int放在这里,因为这种类型违反了限制

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2014-01-16
      • 2021-10-24
      • 1970-01-01
      • 2011-12-17
      • 2012-01-14
      • 2014-05-06
      • 2015-12-30
      相关资源
      最近更新 更多