Xác định đoạn mã sau:Tại sao ClassManifest cần thiết với Array nhưng không phải Danh sách?
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)
Ở đây, tôi cần phải sử dụng ClassManifest
cho nó để biên dịch một cách chính xác, nếu không tôi nhận được lỗi:
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
^
Mặt khác, mã thay thế bên dưới sử dụng List
không yêu cầu điều này và biên dịch tốt.
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
Lưu ý rằng kết quả cuối cùng là testFunc
và testFunc1
giống nhau.
Làm cách nào để phiên bản List
không yêu cầu ClassManifest
?
Câu trả lời của bạn và Angel kết hợp với nhau tạo thành câu trả lời đúng :) – Jus12