Scala 匿名类型约束

标签 scala inheritance types anonymous traits

我得到了一个我无法修改的抽象语法树:

trait Expr
case class Equals(lhs: Expr, rhs: Expr) extends Expr
case class Plus(lhs: Expr, rhs: Expr) extends Expr
case class Id(value: String) extends Expr

现在我想创建一个转换器,但是失败了:

trait Converter[T <: Expr]
trait BinaryConverter[T <: Expr with { def lhs: Expr; def rhs: Expr }] extends Converter[Expr] {
  ???
}

但这不起作用。如果我删除 Expr with,那么它就会编译。如果我删除 with { def lhs: Expr; 则相同def rhs: Expr }. 我应该怎么做才能让它发挥作用?

最佳答案

使用正确的语法:

trait BinaryConverter[T <: Expr { def lhs: Expr; def rhs: Expr }] extends Converter[Expr]

关于Scala 匿名类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660146/

相关文章:

scala - 命名参数会导致维护问题和可读性差?

scala - 如何不使用 ScalatestRouteTest 绑定(bind)到本地主机

Scala-Play 表单 : Cannot find Formatter type class for Enumeration subtype

scala - 只有某些键的映射

c++ - 为什么派生类的大小包括来自基类的私有(private)成员?

JavaScript 继承未按预期工作

c# - 您如何使用可以是多种类型的变量?

types - 在 Rust 的 32 位机器中,f64 类型是如何表示的?

c++ - 如果基类有两个同名函数,则找不到基类函数

types - isize 和 usize 的可用性如何,为什么它们有利于索引?