以下代码编译时没有警告,但未按预期工作。
inline def isXAssignableToY[X <: Matchable, Y]: Boolean = {
inline erasedValue[X] match {
case _: Y => true
case _ => false
}
}
def isSerializable[A <: Matchable]: Boolean = isXAssignableToY[A, Serializable]
def isSuperOfString[B]: Boolean = isXAssignableToY[String, B]
@main def test19058(): Unit = {
val a = isXAssignableToY[String, Serializable]
println(a) // prints true as intended
val b = isSerializable[String]
println(b) // prints false, not as intended
val c = isSuperOfString[Serializable]
println(c) // prints false, not as intended
}
方法
isSerializable
和 isSuperOfString
没有执行预期的操作,因为它们将抽象类型参数传递给 isXAssignableToY
。
如何限制
isXAssignableToY
方法的使用,以便编译器在类型实参是抽象类型参数时发出抱怨?
我知道通过在方法中添加
inline
修饰符可以解决问题。但这不是我要问的。
这个问题与另一个问题相关:当涉及作为内联扩展结果的类型模式匹配时,出现误导性的无法访问警告?
我找到了一个解决方案,但我不认为这是最好的:添加到
TypeTag
s 的 no op SummonInline
inline def isXAssignableToY[X <: Matchable, Y]: Boolean = {
summonInline[ClassTag[X]]
summonInline[ClassTag[Y]]
inline erasedValue[X] match {
case _: Y => true
case _ => false
}
}