注意:我为改变这个问题而道歉,之前我无法表达我面临的确切问题。
假设我们有一个抽象的参数化类abs
,
abstract class abs[T] {
def getA(): T
}
class ABS[Int] extends abs[T] {
override def getA(): Int = 4
}
给出了以下难以理解的错误:
<console>:28: error: type mismatch;
found : scala.Int(4)
required: Int
override def getA(): Int = 4
^
我想覆盖方法getA
。
也非常感谢您的解释或一些有用的链接。
答案 0 :(得分:1)
使用当前的基本方法签名,这是不可能的,因为泛型被删除。
获取一个类型标记(我还将方法的T
重命名为U
,以防止因为阴影造成混淆):
abstract class abs[T] {
def getA[U: TypeTag](): U
}
class ABS[T] extends abs[T] {
override def getA[U]()(implicit tag: TypeTag[U]): U = {
if (tag == typeTag[Int]) new Integer(1)
else if (tag == typeTag[Char]) new Character('1')
else throw new Exception("bad type")
}.asInstanceOf[U]
}
答案 1 :(得分:1)
也许你想要这样的东西
abstract class Abs[T] {
def getA: T
def getA(i: T): T
}
class Absz extends Abs[Int]{
override def getA = 4
override def getA(i: Int) = i
}
(new Absz()).getA //> res0: Int = 4
(new Absz()).getA(3) //> res1: Int = 3
答案 2 :(得分:0)
您可以使用无形多态函数:https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0
import shapeless._
object Abs extends Poly0{
implicit def caseInt = at[Int](4)
implicit def caseChar = at[Char]('4')
}
println(Abs.apply[Int])
println(Abs.apply[Char])