具有相同特征但具有不同类型参数的组合物

Dyl*_*lan 8 generics scala

我现在想知道组合一个符合多个类型参数的一个特征的对象/类/特征.让我说我有

trait Dependent[T]{
  def observeCritereaChanged(oldValue:T, newValue:T):Unit
}
Run Code Online (Sandbox Code Playgroud)

例如,我希望能够为两个不同的类型参数定义一些实现Dependent的特征

trait IntStrDependent extends Dependent[Int] with Dependent[String]
Run Code Online (Sandbox Code Playgroud)

因此,我的IntStrDependent特质实例必须observeCritereaChanged为两种类型定义:

class MyDependent extends IntStrDependent {
  def observeCritereaChanged(oldValue:Int, newValue:Int) = //...
  def observeCritereaChanged(oldValue:String, newValue:String) = //...
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,在尝试创建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]
                                                         ^
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:有没有办法做我正在尝试做的事情(如果是这样,如何)或者这是一个失败的原因,因为Scala不是为了做这种事情而构建的?

Kip*_*ros 3

好问题。我不认为你可以直接做你想做的事。

一种替代方法是trait IntStrDependent extends Dependent[Either[Int, String]],但这并不能完全解决问题。也许迈尔斯·萨宾联合类型编码的变体允许做一些更奇特的事情。

我认为最好的选择是保持简单

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) {}
  }
}
Run Code Online (Sandbox Code Playgroud)

要使用MyDependent,必须明确选择IntString变体,如

MyDependent.I.observeCritereaChanged(1, 2)
Run Code Online (Sandbox Code Playgroud)

在我看来,使类型依赖明确是一件好事。