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

Ars*_*lev 0 reflection types scala

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

def leastUpperBound(thenPartType: Type, elsePartType: Type): Type
Run Code Online (Sandbox Code Playgroud)

是否有某个函数scala.reflect._可以执行评估?或者我是否必须使用这些提取器来实现搜索*TypeApi

提前致谢

Kol*_*mar 5

是的,有一个专门用于此目的的universe方法:lub

import reflect.runtime.universe._

def leastUpperBound(thenPartType: Type, elsePartType: Type): Type =
  lub(List(thenPartType, elsePartType))
Run Code Online (Sandbox Code Playgroud)

使用它:

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
Run Code Online (Sandbox Code Playgroud)