覆盖Scala中的参数化方法

时间:2014-12-18 16:37:21

标签: scala generics

注意:我为改变这个问题而道歉,之前我无法表达我面临的确切问题。

假设我们有一个抽象的参数化类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

也非常感谢您的解释或一些有用的链接。

3 个答案:

答案 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])