Jus*_*s12 12 scala scala-2.8 scala-collections
定义以下代码:
import scala.collection.JavaConversions._
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString
def test[T:ClassManifest](iter:java.util.Iterator[Any], func:Any=>T):Array[T] =
iter.map(i=>func(i)).toArray
def testFunc = test(iter, func)
Run Code Online (Sandbox Code Playgroud)
在这里,我需要使用ClassManifest它来正确编译,否则我得到错误:
scala> def test[T](iter:java.util.Iterator[Any], func:Any=>T):Array[T] =
| iter.map(i=>func(i)).toArray
<console>:11: error: could not find implicit value for evidence parameter of
type ClassManifest[T]
iter.map(i=>func(i)).toArray
^
Run Code Online (Sandbox Code Playgroud)
另一方面,下面使用的替代代码List不需要这个并编译好.
import scala.collection.JavaConversions._
val iter:java.util.Iterator[Any] = Array[Any](1, 2, 3).iterator
def func(a:Any):String = a.toString
def test1[T](iter:java.util.Iterator[Any], func:Any=>T):List[T] =
iter.map(i=>func(i)).toList
def testFunc1 = test1(iter, func).toArray
Run Code Online (Sandbox Code Playgroud)
请注意,最终输出testFunc和testFunc1相同.
为什么List版本不需要ClassManifest?
Dan*_*ral 11
Java中的数组不是类型擦除的,特别Array[Int]是a不同于Array[Object]JVM级别的数组.
对于任何其他类别,类型参数被擦除至Object,所以List[Int]和List[Object]具有JVM级别相同的表示.
| 归档时间: |
|
| 查看次数: |
1905 次 |
| 最近记录: |