Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 泛型抽象函数的部分定义_Function_Scala_Generics_Member - Fatal编程技术网

Function 泛型抽象函数的部分定义

Function 泛型抽象函数的部分定义,function,scala,generics,member,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) = {...} .... } 同样,对于D1、D2类,。。。源自B(可能具有不同的混凝土类型T_j) accross类D_j,以便在未定义foo的类型的参数上

在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) = {...}
    ....
} 
同样,对于D1、D2类,。。。源自B(可能具有不同的混凝土类型T_j) accross类D_j,以便在未定义foo的类型的参数上使用foo时使用obj.foo(u)和编译器标志

简言之,问题是:一旦定义了foo,从B派生的类就被认为是具体的吗
对于示例中至少一个具体类型T?

,不能在
D
中专门化
U
T
,必须匹配基类中的参数。您也不能提供子类中重写的个别特殊情况,如分部函数——具体类必须为每个抽象方法提供实现,覆盖所有参数

在我看来,您真正想要的是类级别上的类型参数,在
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
}

(您可能会发现添加方差注释
B类[-T,+V]
也很有用,但这是另一回事。)

好的。谢谢这是不幸的,为什么不幸?以这种方式使用类型系统的整个想法是能够对方法调用的有效性进行严格的编译时检查。根据你到底想完成什么,可能还有其他更复杂的方法。有各种各样的方法可以关联
foo
中的类型。我想你可能需要问一个新的,更具体的问题来获得帮助。