【发布时间】:2020-08-27 01:56:45
【问题描述】:
我有一个密封特性和一些扩展该特性的案例类,如下所示:
sealed trait Foo
case class Bar extends Foo
case class Baz extends Foo
在我的代码的不同部分,我有一个特征,其上有一个在 Foos 上运行的方法
trait Example {
def method(arg1: Foo, arg2: Foo)
}
但是,我真的很想确保arg1 和arg2 始终具有相同的类型;也就是说,它们都应该是Bar 或Baz,并且不能混合使用。我的第一个直觉是使用泛型:
trait Example {
def method[T: Foo](arg1: T, arg2: T)
}
但是我遇到了两个问题:
-
据我所知,
T需要出现在Example上。我可以将method设为通用而不“感染”其余特征吗? - 我实际上不确定我的类型限制是否能得到我想要的结果。谁能确认我的直觉是否正确?
【问题讨论】:
-
不要使用
T : Foo,使用T <: Foo。我相信前者是上下文绑定的,而 Foo 没有类型参数 -
Bar,Baz应该是Bar(),Baz(),因为它们是案例类。