组成具有相同的特征,但具有不同的类型参数
我目前想知道如何编写符合多种类型参数的一个特征的对象/类/特征。 假设我有
trait Dependent[T]{
def observeCritereaChanged(oldValue:T, newValue:T):Unit
}
例如,我希望能够定义一些为两个不同类型参数实现Dependent的特征
trait IntStrDependent extends Dependent[Int] with Dependent[String]
因此,我的IntStrDependent
特征的实例将不得不为两种类型定义observeCritereaChanged
:
class MyDependent extends IntStrDependent {
def observeCritereaChanged(oldValue:Int, newValue:Int) = //...
def observeCritereaChanged(oldValue:String, newValue:String) = //...
}
到目前为止,在尝试创建IntStrDependent
特征时,我的努力遇到了编译错误:
scala> trait IntStrDependent extends Dependent[Int] with Dependent[String]
<console>:8: error: illegal inheritance;
self-type IntStrDependent does not conform to Dependent[Int]'s selftype Dependent[Int]
trait IntStrDependent extends Dependent[Int] with Dependent[String]
^
<console>:8: error: illegal inheritance;
self-type IntStrDependent does not conform to Dependent[String]'s selftype Dependent[String]
trait IntStrDependent extends Dependent[Int] with Dependent[String]
^
所以我的问题是:有没有办法做我想做的事情(如果是这样,怎么做),还是这是一个失败的原因,因为斯卡拉不是为了做这种事情而设计的?
好问题。 我不认为你可以直接做你想做的事。
一种替代方法是trait IntStrDependent extends Dependent[Either[Int, String]]
但这并不能解决问题。 也许Miles Sabin的联合类型编码的变体允许做更多的事情。
我认为最好的选择是保持简单,
trait Dependent[T]{
def observeCritereaChanged(oldValue:T, newValue:T):Unit
}
trait IntStrDependent {
val I: Dependent[Int]
val S: Dependent[String]
}
object MyDependent extends IntStrDependent {
object I extends Dependent[Int] {
def observeCritereaChanged(oldValue:Int, newValue:Int) {}
}
object S extends Dependent[String] {
def observeCritereaChanged(oldValue:String, newValue:String) {}
}
}
要使用MyDependent
,必须显式选择Int
或String
变体,如in
MyDependent.I.observeCritereaChanged(1, 2)
在我看来,使类型依赖明确是件好事。
链接地址: http://www.djcxy.com/p/9035.html上一篇: Composition with the same trait, but different type parameters