有没有办法限制类型参数只接受特定的类型(拒绝抽象类型参数)?

问题描述 投票:0回答:1

以下代码编译时没有警告,但未按预期工作。

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
修饰符可以解决问题。但这不是我要问的。

这个问题与另一个问题相关:当涉及作为内联扩展结果的类型模式匹配时,出现误导性的无法访问警告?

constraints inline compile-time scala-3
1个回答
0
投票

我找到了一个解决方案,但我不认为这是最好的:添加到

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
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.