Scala在子类通用函数

时间:2017-02-07 09:16:00

标签: scala generics inheritance

这是我的问题。

我有一个抽象类,它定义了一个带有类型参数作为输入和输出的方法。我希望子类在子类化时提供类型信息,但我想以一种我不参与整个类的方式来实现它。

我瞄准的一些伪代码。

abstract class A {
  def foo[T](t: T): T
}

class B() extends A {
  override foo[Int](t: Int): Int = t + 1
}

class C() extends A {
  override foo[Double](t: Double): Double = t + 1.0
}

如何传递子类化的类型信息?我看了类似的问题。它们使用自我类型,类型类和抽象类型来解决这个问题。

谢谢

3 个答案:

答案 0 :(得分:2)

正如您所说,A上的抽象类型可以解决这个问题:

abstract class A {
  type T
  def foo(t: T): T
}

class B extends A {
  override type T = Int
  override def foo(t: Int): Int = t + 1
}

class C extends A {
  override type T = Double
  override def foo(t: Double): Double = t + 1.0
}

答案 1 :(得分:1)

抽象类上的“参数化”怎么样:

abstract class A[T] {
    def foo(t: T): T
}

class B extends A[Int] {
    override def foo(t: Int): Int = t + 1
}

class C extends A[Double] {
    override def foo(t: Double): Double = t + 1.0
}

答案 2 :(得分:1)

您的A特别承诺可以使用任何 T来调用它。所以扩展它的任何类型都必须履行这一承诺。

val a: A = ...
val x = a.foo("a") // calls foo[String]
val y = a.foo(1) // calls foo[Int]

是非常好的代码。但是当它被执行时,a实际上可以是BC或任何扩展A的内容。因此,“在子类化时提供类型信息”并不真正有意义:它将彻底打破子类型(或类型参数)的含义。