2013-02-26 29 views
11

Tôi muốn xác định một hàm trả về một mảng và tôi có một thẻ TypeTag. Tôi có thể tạo ClassTag được yêu cầu không?Trong Scala 2.10, làm thế nào để bạn tạo một ClassTag cho một TypeTag

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 
<console>:11: error: No ClassTag available for X 
     def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 

Hoặc là nó cần thiết để cung cấp bằng chứng tiềm ẩn của ClassTag:

scala> import reflect.ClassTag 
import reflect.ClassTag 

scala> def fun[X: ClassTag: TypeTag]: Array[X] = Array.ofDim[X](10)(implicitly[ClassTag[X]]) 
fun: [X](implicit evidence$1: scala.reflect.ClassTag[X], implicit evidence$2: reflect.runtime.universe.TypeTag[X])Array[X] 

Tôi đã có thể nghĩ nó đơn giản để tạo ra một ClassTag từ một TypeTag, nhưng tôi thấy không có cách nào rõ ràng.

+0

Bản sao có thể có của [Cách nhận TypeTag biểu mẫu TypeTag hoặc cả hai cùng một lúc?] (Http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both- cùng một lúc) – Suma

Trả lời

8

Tôi rất muốn nhìn thấy một giải pháp đơn giản hơn, nhưng đây là những gì tôi đã đưa ra:

def fun[X:TypeTag]: Array[X] = { 
    val mirror = runtimeMirror(getClass.getClassLoader) 
    implicit val xClassTag = ClassTag[X](mirror.runtimeClass(typeTag[X].tpe)) 
    Array.ofDim[X](10) 
} 

Bạn sẽ muốn chắc chắn rằng mặc dù bạn thực sự cần phải vượt qua một TypeTag ở nơi đầu tiên . Thay vào đó, bạn không thể vượt qua một số ClassTag (như trong def fun[X: ClassTag])?

+0

Vấn đề thực sự là mỹ phẩm, tôi cần một TypeTag trong phạm vi của một hàm, nhưng ClassTag tại một trang gọi trong hàm đó, và không muốn có thêm nhiễu kiểu yêu cầu ClassTag ngầm ẩn tất cả lên chuỗi cuộc gọi. –

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