我想做的是通过使用TypeTag在Scala函数中返回泛型类型。这是示例代码。
trait Parent[T]
object IntChild extends Parent[Int]
object StringChild extends Parent[String]
object SomeClass {
def of[A: TypeTag]: Parent[T] = {
getElementType[A] match {
case Int => IntChild
case String => StringChild
}
}
}
SomeClass.of[Array[Int]]
但是会引发编译错误。因为返回的of
方法的类型在编译类型中不是固定的。有什么方法可以从TypeTag获取类型信息并将该类型嵌入返回的类型中?
我期望的是
// T is inferred from TypeTag A.
def of[A: TypeTag, T]: Parent[T] = {
//...
}
我发现此代码也未通过编译。因此,我们需要修复从A的TypeTag推断出的类型信息。
def of[A: TypeTag]: Parent[_] = {
//...
}
这是错误。
type mismatch;
[error] found : Array[Int]
[error] required: Array[_$1]
如何提前获取元素类型?
答案 0 :(得分:2)
我不确定这些定义是否可行。稍微修改一下定义如何?
trait Parent[T]
implicit object IntChild extends Parent[Int]
implicit object StringChild extends Parent[String]
object SomeClass {
def of[A: Parent]: Parent[A] = implicitly
}
这可确保在类型级别完成所有操作,以便获得所需的返回类型。它需要implicit
和IntChild
上的StringChild
修饰符。无需使用另一个名为T
的类型参数,因为它在示例中始终与A
相同。