如何在Scala中将擦除类型缩小(强制转换)为交叉类型?

都灵

考虑:

trait Base
trait Derived extends Base

class Narrow[T<:Base](arg :T) {
    val d = arg match {
        case derived :Derived => Some(derived)
        case _ => None
    }
}

在以前版本的scala(2.11.8 之前)中,我记得derivedT with Derived. 这有时会导致类型推断的意外行为,但提供了完整的信息。现在(在2.11.8),derived该内case子句类型的简单Derived这当然是一个简化的例子,但实际上我有一个接受 a 的方法T with Derived,我想知道是否有可能安全地(并且没有编译器警告)获得对这样一个实例的引用?自然,

case derived :Derived with T =>

产生有关未经检查(已擦除)类型匹配的警告。

阿列克谢·罗曼诺夫

case derived: Derived with T @unchecked作品。当然,使用@unchecked意味着你必须确保代码是安全的,而不是编译器,但在这种情况下,我认为它和 2.11.8 之前一样安全(即由于类型擦除,客户端可以传递实际上不是的参数T) .

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Kotlin中将类型擦除列表转换为数组?

如何从擦除类型转换类型

如何在Scala中将类型为Map [String,Map [String,Any]]的嵌套映射转换为JSON?

Java类型擦除:强制转换插入规则?

如何在Scala类型类中将帮助程序类型定义为与路径无关?

如何在Python中将type.union强制转换为其子类型之一?

如何在Typescript的界面中将联合(或其他)类型设置为强制键名

如何在Java中将String类型转换为Class类型

如何在Delphi中将通用类型转换为实际类型

强制转换“类型擦除”的对象是否安全?

如何转换类型擦除的std :: function?

如何在 Scala 中将映射、序列和基本类型的任何嵌套组合转换为 JSON?

如何在scala dataframe中将Array [Long]转换为Vector类型?

如何在Scala中将Excel日期长类型转换为时间戳

如何在vc 6.0中将对象转换或分配为Variant类型

如何通过强制转换缩小打字稿类型,这是错误的?

Scala的类型擦除如何用于更高种类的类型参数?

如何在函数调用中强制转换类型?

如何在Go中强制转换为类型别名?

如何在导入的React组件上强制转换类型?

如何在Java中强制转换通用列表类型?

在scala中将类型布尔类型转换为Int类型

如何在集合类型之间转换-在Scala中设置为ListSet

如何在使用关联类型的协议中使用类型擦除

如何在目标 c 中强制强制转换和转换数据类型

如何在switch语句中缩小类型

如何在 Swift 中将 Enum 类型转换为 Double

如何在Python中将Json对象转换为树类型?

如何在Pytorch中将张量转换为复杂类型?