如何实现采用参数化特征的子类型并返回它的scala泛型函数

时间:2020-02-04 07:50:16

标签: scala generics type-inference

我在运行时不需要有关T类型的任何信息,因此我认为ClassTag在这里没有用。

我只需要在函数中返回与参数相同的类型即可。

class MyClass[T] extends A with B[T] with C with D

trait A
trait B[T] {
  def usefulMethod: Unit = println("B")
}
trait C
trait D {
 def usefulMethodToo: Unit = println("D")
}

我试图像这样实现我的功能,但是编译器推断Nothing


def helper[T, A <: B[T] with D](x: A): A = {
  x.usefulMethod
  x.usefulMethodToo
  x
}

helper(new MyClass[Int])

可以通过编译器以某种方式进行推断吗?

2 个答案:

答案 0 :(得分:4)

问题在于它无法推断T,但是在这种情况下(可能过于简化了?),您实际上并不需要它:

def helper[A <: B[_] with D](x: A): A = {
  x.usefulMethod
  x.usefulMethodToo
  x
}

此替代方法也适用:

def helper[T, A <: B[T] with D](x: A with B[T]): A = {
  x.usefulMethod
  x.usefulMethodToo
  x
}

答案 1 :(得分:2)

我不确定100%,但是我想在您的特殊情况下MyClass也有一个类型,也许这就是编译器无法推断出它的原因。 我会尝试下一个:

def helper[T, A[_] <: B[_] with D](x: A[T]): A[T] = {
    x.usefulMethod
    x.usefulMethodToo
    x
  }

不幸的是,这不适用于class IntMyClass extends B[Int] with D之类的情况-但我目前没有更好的主意。 希望这可以帮助!