gpt4 book ai didi

scala - 如何在编译时要求类型参数是特征(而不是类或其他类型值)?

转载 作者:行者123 更新时间:2023-12-05 00:10:50 24 4
gpt4 key购买 nike

我正在寻找通用参数的某种上限 T确保 T是一种特质。

class Foo
trait Bar

def f[A ??? IsATrait] = ???

// f[Foo] Won't compile
f[Bar] // this is fine

最佳答案

尝试

typeOf[Bar].typeSymbol.asClass.isTrait // true
typeOf[Foo].typeSymbol.asClass.isTrait // false

在编译时
import scala.language.experimental.macros
import scala.reflect.macros.whitebox

trait IsATrait[A]

object IsATrait {
implicit def materialize[A]: IsATrait[A] = macro impl[A]

def impl[A: c.WeakTypeTag](c: whitebox.Context): c.Tree = {
import c.universe._
val tpA = weakTypeOf[A]
if (tpA.typeSymbol.asClass.isTrait)
q"new IsATrait[$tpA] {}"
else c.abort(c.enclosingPosition, s"$tpA is not a trait")
}
}

def f[A: IsATrait] = ???

f[Bar] // compiles

f[Foo]
//Information: IsATrait.materialize is not a valid implicit value for IsATrait[Foo] because:
// hasMatchingSymbol reported error: Foo is not a trait
//
//Error: could not find implicit value for evidence parameter of type IsATrait[Foo]
//
//Error: not enough arguments for method f: (implicit evidence$1: IsATrait[Foo])Nothing.
// Unspecified value parameter evidence$1.

关于scala - 如何在编译时要求类型参数是特征(而不是类或其他类型值)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com