通用抽象函数的部分定义

时间:2014-10-28 12:45:51

标签: function scala generics member

在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?

1 个答案:

答案 0 :(得分:2)

在您的示例中,您无法在U中专门化TD,您必须匹配基类中的参数。您也无法在子类中提供单独的特殊情况,例如部分函数 - 具体类必须为每个抽象方法提供实现,涵盖所有参数。

在我看来,你真正想要的是类级别的类型参数,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]很有用,但这是另一个故事。)