在Scala中重写参数化方法

在Scala中重写参数化方法,scala,generics,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

注:我很抱歉改变这个问题,之前我无法表达我所面临的确切问题

假设我们有一个抽象的参数化类
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
                              ^
:28:错误:类型不匹配;
找到:scala.Int(4)
必填项:Int
覆盖def getA():Int=4
^
我想重写方法
getA


另外,如果您能提供解释或一些有用的链接,我们将不胜感激。

您可以使用不成形的多态函数:


对于当前的基本方法签名,这是不可能的,因为泛型会被擦除

取一个类型标记(我还将方法的
T
重命名为
U
,以防止由于阴影而造成混淆):


也许你想要这样的东西


抽象类Abs[T]{
def getA:T
def getA(i:T):T
}

类Absz扩展Abs[Int]{ 覆盖def getA=4 覆盖def getA(i:Int)=i }

(新的Absz()).getA/>res0:Int=4 (新的Absz()).getA(3)/>res1:Int=3


@m-z:你是说我在写多余的代码吗?从这个例子中,我只想了解这是如何做到的。对于
getA[T]
一般应该做什么,这是一个令人困惑的问题。方法的类型参数与抽象类的类型参数之间的阴影更令人困惑。@m-z:“方法的类型参数与抽象类的类型参数之间的阴影”是什么意思?不能重写同一个方法两次。你到底想做什么?m-z所说的是类
abs
有一个类型参数
T
,然后方法
getA
有另一个类型参数,但它也被称为
T
,这非常令人困惑。@m-z:这里我只想要一些重写的方法为不同的类型返回不同的值。这里我举了
Int
Char
的例子。我的主要动机是在重写方法中使用泛型,而不是以其他方式。不可能像您在原始问题中尝试的方式那样做,Shapess为问题提供了解决方法。我修改了问题,以更好地说明我到底想要什么。嘿,我无法准确地表达我想要的,所以我只是修改了问题。请不要修改问题,特别是当其他人已经尽力提供答案时。如果你有不同的问题,问一个新的。这正是我想要的。感谢您理解并回答了这个问题。不过,我想要的不是两个
getA
方法。只要一个就够了。我无法理解如何扩展参数化类。所以我只需要做
类Absz扩展Abs[Int]
而不是
类Absz[Int]扩展类Abs[T]
。你能解释一下这个符号吗,它让我有点困惑。你应该阅读java泛型教程()。它是Java,但本质是一样的,而且非常详细。无论如何,通过说Abs[T],您正在创建一个可以支持多种类型的泛型类。扩展Abs的类将定义Abs支持的类型。扩展Abs的类将具有适当的类型,而不是T,因此
类Absz[Int]扩展类Abs[T]
非常混乱,没有意义:P
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])
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]
}

 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