问题描述
考虑以下sealed trait
:
sealed trait Type
object Type {
case object S
}
sealed trait Test{
type Tpe <: Type
}
object Test {
type Aux[T <: Type] = Test{ type Tpe = T }
}
给定一个表示 ClassSymbol
的 Test.Aux[S.type]
有没有办法得到一个表示 ClassSymbol
的 sealed trait Test
?
解决方法
在深入研究 API 后,我找到了以下解决方案:
def refinedSealedTrait(symbol: Symbols#Symbol): Symbol = {
if (!symbol.isRefinementClass) {
return false
}
val parents = symbol.parentSymbols
if (parents.size != 1) {
return false
}
val parentSymbol = parents.iterator.next
if (parentSymbol.isSealed && parentSymbol.isTrait) {
parentSymbol
} else {
c.abort(...)
}
}