【发布时间】:2014-11-30 13:14:33
【问题描述】:
据我了解,@specialized 注释应该为我提到的每种原始类型生成一些未装箱的代码,但这不起作用:
scala> def aaa[@specialized(Int, Double, Float, Long) T] = (5.0).doubleValue.asInstanceOf[T]
aaa: [T]=> T
scala> aaa[Int]
unrecoverable error (inside interpreter/compiler)
这样编译:
scala> def aaa[@specialized(Int, Double, Float, Long) T](a: T) = (5.0).doubleValue.asInstanceOf[T]
aaa: [T]=> T
scala> aaa[Int](0)
ClassCastException
但它仍然为 asInstanceOf[T] 使用盒装类型。这显然有效:
scala> (5.0).asInstanceOf[Int]
res28: Int = 5
更新:
键入擦除和类似Writing a generic cast function Scala 的答案与我的问题无关。类型擦除只是阻止编译器为泛型添加 typecast 字节码操作,但最终它将被添加 - 请参阅我的 REPL 中的 ClassCastException(由此操作生成)
【问题讨论】:
标签: scala generics primitive-types