【发布时间】:2015-01-12 01:40:46
【问题描述】:
这个密封特性编译:
sealed trait Tree[Int , String]
但如果我使用元组:
sealed trait Tree[(Int , String)]
导致编译器错误:
identifier expected but '(' found.
元组是密封特征的特例吗?
【问题讨论】:
标签: scala
这个密封特性编译:
sealed trait Tree[Int , String]
但如果我使用元组:
sealed trait Tree[(Int , String)]
导致编译器错误:
identifier expected but '(' found.
元组是密封特征的特例吗?
【问题讨论】:
标签: scala
当你声明时
sealed trait Tree[Int, String]
它实际上与Int 和String 类型无关。您正在声明名为 Int 和 String 的类型参数(即它们“影子”Int 和 String)。例如,这是一个有效的扩展:
case object Pine extends Tree[Boolean, BigDecimal]
编译器抱怨,因为您使用无效的语法来声明类型参数(括号)。看起来您正在尝试声明固定类型参数,这没有任何意义。
使用 def(或类或任何特征)尝试此操作会得到相同的编译错误:
def foo[(Int, String)](a: (Int, String)): Unit
【讨论】:
Int 不指代Int 类型,它只是占位符符号。这与声明 Tree[A, B] 没有什么不同
您的原始声明(
trait Tree[Int, String]
) 并不意味着特征 Tree 在 Scala 中采用 Int 和 String 的参数。
如果你想声明一个接受Int 和String 的类:
class Foo(i: Int, s: String)
如果你需要类是不能带参数的特征:
trait Foo {
val i: Int
val s: String
}
【讨论】: