【发布时间】:2019-06-30 03:18:33
【问题描述】:
编译以下示例代码时出现错误。
abstract class Base
case class A(i: Int) extends Base
case class B(s: String) extends Base
class Transform {
def func[T <: Base](arg: T): T = arg match {
case A(i) => A(i)
case B(s) => B(s)
}
}
错误是
Example.scala:9: error: type mismatch;
found : A
required: T
case A(i) => A(i)
^
Example.scala:10: error: type mismatch;
found : B
required: T
case B(s) => B(s)
^
two errors found
这些错误是合理的。
为了避免这种情况,我需要将asInstanceOf[T] 放在像A(i).asInstanceOf[T] 这样的实例化后面。但是,如果有很多匹配案例模式,那么对所有返回值都这样做很烦人。
另外,我想使用Transform类作为父类并覆盖func()来执行如下代码的具体操作。
class ExtTransform extends Transform {
override def func[T <: Base](arg: T): T = arg match {
case A(i) => A(i + 1)
case _ => super.func(arg)
}
}
有没有更好的方法或技巧?
【问题讨论】:
-
谢谢!但是,您的建议不适合我。我不是很了解反射,但
typeTag似乎是用于类类型参数的。 -
目标是什么?
arg已经是A或B,知道哪种类型又如何? -
@cchantep 我的目标是返回 arg 的值类型值(不是变量类型值)。匹配表达式保证了这种操作的安全性(至少如果返回值是相同类型的匹配类型)。但是,scala 编译器无法检测到这一点。可能 scala 编译器现在会忽略使用匹配表达式来检查返回类型安全性的类型检查。
-
@cchantep 我想说的是,虽然我使用
arg返回了由匹配表达式标识的类型,但scala编译器预测arg的类型和返回类型是不同的(例如arg的类型是A,返回类型是B)。
标签: scala generics type-parameter