2013-06-04 24 views
47

Tôi tương đối mới đối với Scala và đang cố định nghĩa một phương thức chung chung. Tuy nhiên, khi tôi tham khảo các loại tham số trong phương pháp tôi nhận được "No ClassTag có sẵn cho T". Dưới đây là một ví dụ contrived minh họa vấn đề.Phương pháp chung của Scala - Không có ClassTag nào cho T

scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 
<console>:7: error: No ClassTag available for T 
     def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 
                     ^

Cảm ơn bạn đã giúp đỡ trong việc tìm hiểu điều gì sai ở đây và cách làm ví dụ giả tạo này hoạt động.

Trả lời

59

Để khởi tạo một mảng trong một bối cảnh chung (instantiating một mảng của T nơi T là một tham số type), Scala cần phải có thông tin trong thời gian chạy về T, dưới hình thức của một giá trị tiềm ẩn của loại ClassTag[T]. Cụ thể, bạn cần gọi phương pháp của bạn để (ngầm) vượt qua giá trị này ClassTag, mà thuận tiện có thể được thực hiện bằng một bối cảnh ràng buộc:

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 

Đối với một (triệt để) mô tả về tình trạng này, hãy xem tài liệu:

http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

(Để đặt nó trong thời gian ngắn, ClassTags là việc thực hiện làm lại của ClassManifests, vì vậy lý do vẫn còn)

+8

Hấp dẫn. Với 'import scala.reflect.ClassTag', nó hoạt động. Cảm ơn. – Chuck

+3

Mọi người cũng có thể tìm thấy hướng dẫn này - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - vì ClassManifests sẽ biến mất. – Chuck

+0

Nếu chúng ta so sánh hai giá trị của kiểu T trong thân hàm, chúng ta cần tham số orderer 'implicit' bổ sung vào chú thích' ClassTag'. – AlvaPan

Các vấn đề liên quan