这是我的问题。
我有一个抽象类,它定义了一个带有类型参数作为输入和输出的方法。我希望子类在子类化时提供类型信息,但我想以一种我不参与整个类的方式来实现它。
我瞄准的一些伪代码。
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
}
如何传递子类化的类型信息?我看了类似的问题。它们使用自我类型,类型类和抽象类型来解决这个问题。
谢谢
答案 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
实际上可以是B
,C
或任何扩展A
的内容。因此,“在子类化时提供类型信息”并不真正有意义:它将彻底打破子类型(或类型参数)的含义。