Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不知怎的,我破坏了Scala类型的安全_Scala_Type Safety - Fatal编程技术网

不知怎的,我破坏了Scala类型的安全

不知怎的,我破坏了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类的吗?在工作表输出下方显示:

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代码和谷歌搜索没有透露任何具体信息。拥有更多知识的人必须提供更好的洞察力。