gpt4 book ai didi

scala - 为什么 Array 需要 ClassManifest 而不是 List?

转载 作者:行者123 更新时间:2023-12-04 00:23:16 25 4
gpt4 key购买 nike

定义以下代码:

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)

在这里,我需要使用 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
^

另一方面,下面的替代代码使用 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

注意 testFunc的最终输出和 testFunc1是相同的。

怎么来的 List版本不需要 ClassManifest ?

最佳答案

Java 中的数组不会被类型删除,特别是 Array[Int]不同于 Array[Object]在 JVM 级别。

对于任何其他类,类型参数被删除为 Object , 所以 List[Int]List[Object]在 JVM 级别具有相同的表示。

关于scala - 为什么 Array 需要 ClassManifest 而不是 List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com