我在运行时不需要有关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])
可以通过编译器以某种方式进行推断吗?
答案 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
之类的情况-但我目前没有更好的主意。
希望这可以帮助!