【问题标题】:Can sealed trait contain Tuples?密封特征可以包含元组吗?
【发布时间】:2015-01-12 01:40:46
【问题描述】:

这个密封特性编译:

sealed trait Tree[Int , String]

但如果我使用元组:

sealed trait Tree[(Int , String)]

导致编译器错误:

identifier expected but '(' found.

元组是密封特征的特例吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    当你声明时

    sealed trait Tree[Int, String]
    

    它实际上与IntString 类型无关。您正在声明名为 IntString 的类型参数(即它们“影子”IntString)。例如,这是一个有效的扩展:

    case object Pine extends Tree[Boolean, BigDecimal]
    

    编译器抱怨,因为您使用无效的语法来声明类型参数(括号)。看起来您正在尝试声明固定类型参数,这没有任何意义。

    使用 def(或类或任何特征)尝试此操作会得到相同的编译错误:

    def foo[(Int, String)](a: (Int, String)): Unit
    

    【讨论】:

    • 是“case object Pine extends Tree[Boolean, BigDecimal]”由于类型擦除而有效的原因吗?
    • @blue-sky 不,这是因为Int 不指代Int 类型,它只是占位符符号。这与声明 Tree[A, B] 没有什么不同
    • 所以 "sealed trait Tree[Int, String]" 中的 Int 和 String 类型是无关紧要的,它们只是表示 Tree 类型接受某种类型的两个类型参数的占位符?
    • 是这样写的。
    【解决方案2】:

    您的原始声明(

    trait Tree[Int, String]
    

    ) 并不意味着特征 Tree 在 Scala 中采用 IntString 的参数。

    如果你想声明一个接受IntString 的类:

    class Foo(i: Int, s: String)
    

    如果你需要类是不能带参数的特征:

    trait Foo {
      val i: Int
      val s: String
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多