我在理解TypeTest
scala3 中的 s 如何替换TypeTag
scala 2 中的使用时遇到问题。用例能够匹配诸如 x: List [Int] 之类的通用参数。
我试图解决的具体例子:
enum Foo :
case Bar()
case Baz()
case class Mod[T <: Foo](modFn: T => T)
def modifyBarsOrBaz(mod: Mod[_]) = mod match
case barMod: Mod[Foo.Bar] => ???
case bazMod: Mod[Foo.Baz] => ???
编译器警告中的编译结果(如预期)
the type test for Mod[Foo.Bar] cannot be checked at runtime
和一个遥不可及的案例。
现在我的问题是:这可能在 scala3 中完成吗?
我的印象是我必须以某种方式TypeTest[Any, Mod[Foo.X]]
为所有 X提供一个Foo
枚举的子类。
但我什至在努力实现这些测试,以及了解它需要什么using
参数modifyBarsOrBaz
才能工作。
因此,我想出了以下(不工作)解决方案:
def modifyBarsOrBaz[T <: Foo](mod: Mod[T])(using TypeTest[Any, Mod[T]]) = mod match
case barMod: Mod[Foo.Bar] => ???
case bazMod: Mod[Foo.Baz] => ???
和一个天真的 tt 实现
val tt: TypeTest[Any, Mod[Foo.Bar]] =
new TypeTest[Any, Mod[Foo.Bar]] :
def unapply(x: Any): Option[x.type & Mod[Foo.Bar]] = x match
case m: Mod[_] => ??? // what to do here? use a classtag on Mod?
我试图在网上搜索答案,但由于这是相当新的,我并不幸运。有什么提示吗?