Scala类型:reflect:如何在运行时找到两种类型的最小上限

时间:2016-06-15 11:49:53

标签: scala reflection types

我正在使用Scala类型系统实现一些表达式。要确定if-then-else表达式的类型,我需要能够实现以下函数

def leastUpperBound(thenPartType: Type, elsePartType: Type): Type

scala.reflect._中的某个地方是否有执行评估的功能?或者我是否必须使用那些*TypeApi提取器实现搜索?

提前致谢

1 个答案:

答案 0 :(得分:4)

是的,universe只有一个方法lub

import reflect.runtime.universe._

def leastUpperBound(thenPartType: Type, elsePartType: Type): Type =
  lub(List(thenPartType, elsePartType))

使用它:

trait Base
class A extends Base
class B extends Base

scala> com.Main.leastUpperBound(typeOf[A], typeOf[B])
res0: reflect.runtime.universe.Type = Base

scala> com.Main.leastUpperBound(typeOf[A], typeOf[String])
res1: reflect.runtime.universe.Type = java.lang.Object

scala> com.Main.leastUpperBound(typeOf[A], typeOf[Int])
res1: reflect.runtime.universe.Type = Any