在scala中,可以在基类中声明泛型抽象函数然后 在各种派生类中提供不同的具体实现,如下所示:
abstract class B {
def foo[T,V](u:T):V
}
class D extends B {
def foo(u:T_0) = {...}
def foo(u:T_1) = {...}
....
}
同样适用于从B派生的D1,D2 ......类(可能具有不同的具体类型T_j) 为了在没有定义foo的类型的参数上使用foo时使用obj.foo(u)和编译器标志,使用类D_j。
简而言之,问题是:一旦定义了foo,就是从B中派生出来的类 对于至少一种具体类型T?
答案 0 :(得分:2)
在您的示例中,您无法在U
中专门化T
和D
,您必须匹配基类中的参数。您也无法在子类中提供单独的特殊情况,例如部分函数 - 具体类必须为每个抽象方法提供实现,涵盖所有参数。
在我看来,你真正想要的是类级别的类型参数,B
本身,以便派生类专门化这些参数,然后它们继承的foo
方法的接口变为相应的专业。所以,你想做的事情如下:
abstract class B[T, V] {
def foo(u: T): V
}
class D extends B[String, Int] {
def foo(u: String): Int = u.length
}
(您可能还会发现添加方差注释class B[-T, +V]
很有用,但这是另一个故事。)