我知道擦除是什么类型的。因此,我认为scala不能准确地检测泛型类型。
如前所述,scala无法检测模式匹配中的泛型类型,如下所示:
case list: List[Int]但是,当我声明列表类型值时,scala会检测到包含了什么泛型类型。
scala> val a = List(1,2,3)
a: List[Int] = List(1, 2, 3)这怎么可能呢?
发布于 2014-01-19 17:20:51
val a = List(1,2,3)这相当于:
val a = List.apply[Int](1,2,3)List.apply[Int](...)的结果类型是List[Int],因此,类型推断器将此类型分配给标识符a。这种情况发生在编译期间。REPL不会在运行时“检测”该类型。
这与模式匹配不同:
val a: Any = ...
a match {
case list: List[Int] => ...
}这里,我们有一个值a,对于这个值,我们没有任何类型信息。所以我们试图检查它的类型,但是现在我们在运行时中这样做。在这里,我们确实无法确定确切的类型。我们在这里能做的最好的就是和List[_]比赛。
总结:当您在REPL中键入一些代码时,首先将其编译成字节码,然后进行评估。显示的类型信息来自编译阶段,因此它不受类型擦除的影响。
发布于 2014-01-19 17:23:37
当你写:
val a = List(1,2,3)Scala使用类型推断在编译期间找到最接近的匹配类型。从本质上讲,它将为您重写它,作为:
val a: List[Int] = ...它将在编译时使用此参数类型信息来键入、检查代码,然后将其擦除,以便在程序中获得List[_]。这是因为JVM以这种方式工作--类型擦除。
当您在运行时在列表上设置匹配模式时,它的类型信息将被删除,因此任何List都会匹配。Scala编译器在编译过程中会警告您。
这在REPL和常规编译->运行周期中的工作方式是相同的。
https://stackoverflow.com/questions/21219827
复制相似问题