scala - Scala 中是否可以等于抽象类型成员?

标签 scala types abstract

泛型类型参数相对于抽象类型成员的一个优点似乎是前者可以等同,例如:

trait A[X]
trait B[Y]
trait C[Z] extends A[Z] with B[Z]

同样:

trait C[Z] {
    self: A[Z] with B[Z] =>
}

类型参数的赋值实际上说明了三件事:X = Z、Y = Z,因此 X = Y。

第一种情况可以类似地表示:

trait A { type X }
trait B { type Y }
class C extends A with B { type X = Z; type Y = Z; type Z }

但是,抽象类型成员是否可能出现类似于第二种情况的情况?以下解决方案不起作用,因为无法从自身类型定义中引用类型“Z”,而自身类型定义本身必须首先出现:

trait C {
  self: A with B { type X = Z; type Y = Z } =>
  type Z
}

奇怪的是,即使明显违反了“b”的类型要求,以下内容似乎也能编译:

trait C2 {
    val a: A { type X = Z }
    val b: B { type Y = Z }
    type Z
}

class A2 extends A { type X = Int }
class B2 extends B { type Y = String }
class D extends C2 {
    override val a = new A2
    override val b = new B2
    type Z = Int
}

最佳答案

您可以使用类型参数相等的见证,=:=scalaz.Leibniz.=== (这是更通用的,但意味着取决于在 scalaz 上)。

class C extends A with B { type Z; val w1: X =:= Z; val w2: Y =:= Z }

如果类型不相等,则无法实例化它,您可以使用 w1w2 来“转换”类型为 X 的值Y 来输入 Z

关于scala - Scala 中是否可以等于抽象类型成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26348723/

相关文章:

scala - 在 Slick 中打印内插 SQL 查询

java - Java 中 C 的这些等效数据类型是什么?

c++ - "atom"数据类型是什么?

java - 我可以有一个空的 Java 类吗?

Scala - 从 2.7.7 升级到 2.8.1 时使用 MapWrapper 时出现问题

java - 如何使用嵌入式 ElasticSearch 进行集成测试

function - 如何实现 typeOf 函数?

java - 学习接口(interface)和层次结构,在哪里放置某些变量和方法?

C++ Cycling 包括(三个类,两个虚拟)

scala - Scala 中出现 `cannot resolve symbol` 错误的通用方法