不知怎的,我破坏了Scala类型的安全
可以解释一下我是如何创建一个错误类型的case类的吗?在工作表输出下方显示:不知怎的,我破坏了Scala类型的安全,scala,type-safety,Scala,Type Safety,可以解释一下我是如何创建一个错误类型的case类的吗?在工作表输出下方显示: case class OptObj(os: Option[String], s: String) //defined class OptObj val osCrazy: Option[Any] = Option(Option(Option(1))) //osCrazy: Option[Any] = Some(Some(Some(1))) def anyOpt: Option[Any] = osCrazy //any
case class OptObj(os: Option[String], s: String)
//defined class OptObj
val osCrazy: Option[Any] = Option(Option(Option(1)))
//osCrazy: Option[Any] = Some(Some(Some(1)))
def anyOpt: Option[Any] = osCrazy
//anyOpt: Option[Any]
def getOpt[T]: Option[T] = anyOpt.map(_.asInstanceOf[T])
//getOpt: [T]=> Option[T]
val o = OptObj(getOpt[String], "It has the wrong type inside, but was built!")
//o: OptObj = OptObj(Some(Some(Some(1))),It has the wrong type inside, but was built)
o == OptObj(None,"")
//res0: Boolean = false
o == o
//res1: Boolean = true
o.os
//res2: Option[String] = Some(Some(Some(1)))
o.os.get
//java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String
对象是使用错误的内部类型创建的,对象创建是否应该失败?当我尝试对os属性进行一些操作时,它失败了。的文档解释了您看到的内容。它的缺点是由于类型擦除而编译代码
请注意,运行时强制转换的成功在于modulo Scala的擦除语义。因此,表达式1.asInstanceOf[String]
将在运行时抛出ClassCastException
,而表达式List(1).asInstanceOf[List[String]
将不会。在后一个示例中,由于类型参数作为编译的一部分被删除,因此无法检查列表的内容是否属于请求的类型
请注意,在编译代码时,您将收到一条关于未检查强制转换的警告。这正是那个警告所警告你的。然而,让我疑惑的是,我能够创建这个对象。所以他在创建对象时不进行类型检查?这是一个有趣的观点。我没注意到那细微的差别。一堆Scala代码和谷歌搜索没有透露任何具体信息。拥有更多知识的人必须提供更好的洞察力。