在Scala中实例化特征时如何限制方法的类型参数

时间:2020-04-01 20:38:08

标签: scala

SSlogis

在Scala中实现特征时是否可以限制方法中的类型参数? (已编辑)

我不想通过特征参数化

例如

trait A{ 
 def a[K]: Int
}
new A{
  def a[K:SomeTypeClass] = ???
}

1 个答案:

答案 0 :(得分:0)

Liskov substitution principle要求抽象函数的实现必须接受该抽象函数接受的所有类型。

要避免这种情况,您必须在trait上具有类型参数,以便不同的实现具有不同的接口,因此不必遵循Liskov。

trait A[TypeClass[_]] {

  def a[K: TypeClass]: Int
}

new A[SomeTypeClass] {
  def a[K: SomeTypeClass]: Int = ???
}

trait A {
  type TypeClass[_]

  def a[K: TypeClass]: Int
}

new A {
  type TypeClass[T] = SomeTypeClass[T]

  def a[K: SomeTypeClass]: Int = ???
}