定義如下代碼:爲什麼ClassManifest需要Array而不是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 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
?
「大概是因爲對象是居然把上堆順序」不,他們不是。對象數組依次存儲引用,而不是對象本身。 (當然,這不適用於基元數組。) – 2011-01-31 21:03:14
編輯贊成更模糊的推理。螺絲遺產,認真... – Raphael 2011-01-31 23:07:12