scala 反射,获取 super class 的类型参数
scala reflection, get type parameter of super class
如何从子class中获取超class类型参数的具体类型?
假设我有一个通用超级 class、一个中间 class 和一个子 class,如下所示:
class SuperClass[A, B]
class IntClass[A] extends SuperClass[A, Int]
class MyClass extends SuperClass[String, Int]
我想要一个函数 "getTypeArgs",returns 超类的类型参数:
val superClassType = typeOf[SuperClass[_, _]]
val superClassOfStringInt = appliedType(superClassType.typeConstructor, typeOf[String], typeOf[Int])
getTypeArgs(superClassOfStringInt, superClassType)
// [TEST1] should return List(String, Int)
getTypeArgs(typeOf[MyClass], superClassType)
// [TEST2] should return List(String, Int)
val intClassOfLong = appliedType(typeOf[IntClass[_]].typeConstructor, typeOf[Long])
getTypeArgs(intClassOfLong, superClassType)
// [TEST3] should return List(Long, Int)
我试过解决方案 :
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
internal
.thisType(t.dealias.typeSymbol)
.baseType(fromType.typeSymbol.asClass)
.typeArgs
}
它适用于 TEST2,但 TEST1 returns List(A, B) 和 TEST3 returns List(A, Int).
我可以通过添加测试来检查符号是否相等来修复 TEST1:
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
if (t.erasure.typeSymbol == fromType.typeSymbol)
t.typeArgs
else
internal
.thisType(t.dealias.typeSymbol)
.baseType(fromType.typeSymbol.asClass)
.typeArgs
}
我不知道如何让 TEST3 工作。
其实解决方法很简单:
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
t.baseType(fromType.typeSymbol).typeArgs
}
这个函数通过了所有测试。
如何从子class中获取超class类型参数的具体类型?
假设我有一个通用超级 class、一个中间 class 和一个子 class,如下所示:
class SuperClass[A, B]
class IntClass[A] extends SuperClass[A, Int]
class MyClass extends SuperClass[String, Int]
我想要一个函数 "getTypeArgs",returns 超类的类型参数:
val superClassType = typeOf[SuperClass[_, _]]
val superClassOfStringInt = appliedType(superClassType.typeConstructor, typeOf[String], typeOf[Int])
getTypeArgs(superClassOfStringInt, superClassType)
// [TEST1] should return List(String, Int)
getTypeArgs(typeOf[MyClass], superClassType)
// [TEST2] should return List(String, Int)
val intClassOfLong = appliedType(typeOf[IntClass[_]].typeConstructor, typeOf[Long])
getTypeArgs(intClassOfLong, superClassType)
// [TEST3] should return List(Long, Int)
我试过解决方案
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
internal
.thisType(t.dealias.typeSymbol)
.baseType(fromType.typeSymbol.asClass)
.typeArgs
}
它适用于 TEST2,但 TEST1 returns List(A, B) 和 TEST3 returns List(A, Int).
我可以通过添加测试来检查符号是否相等来修复 TEST1:
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
if (t.erasure.typeSymbol == fromType.typeSymbol)
t.typeArgs
else
internal
.thisType(t.dealias.typeSymbol)
.baseType(fromType.typeSymbol.asClass)
.typeArgs
}
我不知道如何让 TEST3 工作。
其实解决方法很简单:
def getTypeArgs(t: Type, fromType: Type): List[Type] = {
t.baseType(fromType.typeSymbol).typeArgs
}
这个函数通过了所有测试。