Почему ClassManifest нужен с массивом, но не со списком?

Определите следующий код:

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 ?

12
задан Jus12 22 June 2016 в 17:37
поделиться