覆盖抽象类型成员

时间:2018-09-30 17:56:27

标签: scala generics

abstract class Box {
    type T <: String
}

type InvariantBox = Box { type T = AnyRef } // compiles

abstract class Box2 extends Box {
    type T = AnyRef //Error:overriding type T in class
                    // Box with bounds <: String; type T 
                    // has incompatible type type T = AnyRef
}

为什么可以在InvariantBox中重新定义T类型的参数,但在Box2中不允许这样做?

1 个答案:

答案 0 :(得分:1)

因为您有权创建交点

type HasT = { type T = AnyRef }
type InvariantBox = Box with HasT

否则,对于任何类型的AB,您都不能创建类型A with B

对于类来说,有最重要的规则。

Scala允许定义类型,不包含任何值或仅包含null值。