密封特征可以包含元组吗?
Can sealed trait contain Tuples?
此密封特征编译:
sealed trait Tree[Int , String]
但是如果我使用元组:
sealed trait Tree[(Int , String)]
导致编译器错误:
identifier expected but '(' found.
元组是密封特征的特例吗?
申报时
sealed trait Tree[Int, String]
其实跟Int
和String
类型没有关系。您正在声明名为 Int
和 String
的类型参数(即它们 "shadow" Int
和 String
)。例如,这是一个有效的扩展名:
case object Pine extends Tree[Boolean, BigDecimal]
编译器报错是因为您使用了无效的语法来声明类型参数(括号)。您似乎在尝试声明固定类型参数,这毫无意义。
如果使用 def(或 class 或任何特征)进行尝试,您会得到相同的编译错误:
def foo[(Int, String)](a: (Int, String)): Unit
您的原始声明(
trait Tree[Int, String]
) 并不意味着特征 Tree
在 Scala 中采用 Int
和 String
的参数。
如果你想声明一个 class 需要 Int
和 String
:
class Foo(i: Int, s: String)
如果你需要 class 是不能带参数的特征:
trait Foo {
val i: Int
val s: String
}
此密封特征编译:
sealed trait Tree[Int , String]
但是如果我使用元组:
sealed trait Tree[(Int , String)]
导致编译器错误:
identifier expected but '(' found.
元组是密封特征的特例吗?
申报时
sealed trait Tree[Int, String]
其实跟Int
和String
类型没有关系。您正在声明名为 Int
和 String
的类型参数(即它们 "shadow" Int
和 String
)。例如,这是一个有效的扩展名:
case object Pine extends Tree[Boolean, BigDecimal]
编译器报错是因为您使用了无效的语法来声明类型参数(括号)。您似乎在尝试声明固定类型参数,这毫无意义。
如果使用 def(或 class 或任何特征)进行尝试,您会得到相同的编译错误:
def foo[(Int, String)](a: (Int, String)): Unit
您的原始声明(
trait Tree[Int, String]
) 并不意味着特征 Tree
在 Scala 中采用 Int
和 String
的参数。
如果你想声明一个 class 需要 Int
和 String
:
class Foo(i: Int, s: String)
如果你需要 class 是不能带参数的特征:
trait Foo {
val i: Int
val s: String
}