2

我在使用反射比较两种类型之间的“兼容性”时遇到问题(实际上我正在编写一个宏)。例如,我想允许Vector[Int] === List[Int]. 现在我知道了一般的做法。但问题是在这种情况下我无法获取类型构造函数参数:

import scala.reflect._
import runtime.universe._

typeOf[List[Int]].typeArgs                             // List(Int) OK
typeOf[List[Int] with java.io.Serializable].typeArgs   // List()    FAIL

为什么这是个问题?

def test[A, B >: A](a: A, b: B)(implicit tt: TypeTag[B]) = {
  println(s"tt = $tt")
  typeOf[B].typeArgs
}

现在这有效:

test(List(1, 2, 3), List(1, 2, 3))  // List(Int)

但这不会:

test(Vector(1, 2, 3), List(1, 2, 3))  // List()
4

1 回答 1

0

可以使用一个名为的提取器RefinedType

def test[A, B >: A](a: A, b: B)(implicit tt: TypeTag[B]): List[List[Type]] = {
  val all = typeOf[B] match {
    case RefinedType(parents, scope) => parents.map(_.typeArgs)
    case x => x.typeArgs :: Nil
  }
  all.filter(_.nonEmpty)
}

test(List(1, 2, 3), List(1, 2, 3))
test(Vector(1, 2, 3), List(1, 2, 3))

然后仍然必须以某种方式找到一种策略来调整父母。(我现在正在测试所有组合)。

于 2016-04-23T23:19:22.103 回答