gpt4 book ai didi

scala - 为具有已删除参数的类型合成 ClassTag 时,如何取消隐藏未经检查的警告?

转载 作者:行者123 更新时间:2023-12-04 01:05:10 25 4
gpt4 key购买 nike

类型参数 T 上的模式匹配引发未检查警告

scala> def f[T](v: List[Any]): List[T] = v.collect { case x: T => x }
^
warning: abstract type pattern T is unchecked since it is eliminated by erasure
def f[T](v: List[Any]): List[T]

哪个可能会尝试用 ClassTag 来解析

scala> def f[T: scala.reflect.ClassTag](v: List[Any]): List[T] = v.collect { case x: T => x }
def f[T](v: List[Any])(implicit evidence$1: scala.reflect.ClassTag[T]): List[T]

它解决了简单的基于类的类型的警告

scala> f[String](List(42, "a"))
val res7: List[String] = List(a)

但是现在,即使对于具有在运行时已删除组件的参数化类型的类型,未经检查的警告也会隐藏

f[List[String]](List(List(42)))
val res9: List[List[String]] = List(List(42)) // oops!

在后一种情况下,我们如何继续引发未经检查的警告?

最佳答案

Scala 3 replaces ClassTagTypeTest,或者它的简写 Typeable,当我们尝试检查的不仅仅是类型的类组件时,它会发出警告

scala> def f[T: scala.reflect.Typeable](v: List[Any]): List[T] = v.collect { case x: T => x }
def f[T](v: List[Any])(implicit evidence$1: scala.reflect.Typeable[T]): List[T]

scala> f[String](List(42, "a"))
val res0: List[String] = List(a)

scala> f[List[String]](List(List(42)))
1 |f[List[String]](List(List(42)))
| ^
| the type test for List[String] cannot be checked at runtime
val res1: List[List[String]] = List(List(42))

作为smarter把它

TypeTag doesn't exist anymore

ClassTag.unapply for type tests is unsound and shouldn't be used

instead we have TypeTest now: lampepfl/dotty#7555

关于scala - 为具有已删除参数的类型合成 ClassTag 时,如何取消隐藏未经检查的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66697856/

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