2011-05-21 32 views
8

này không hoạt động:Tại sao tôi không thể tạo một mảng kiểu chung?

def giveArray[T](elem:T):Array[T] = { 
    new Array[T](1) 
    } 

Nhưng điều này không:

def giveList[T](elem:T):List[T] = { 
    List.empty[T] 
    } 

Tôi chắc chắn đây là một điều khá cơ bản và tôi biết rằng Mảng có thể cư xử một chút bất thường trong Scala.

Ai đó có thể giải thích cho tôi cách tạo một mảng như vậy và tại sao nó không hoạt động ngay từ đầu?

Trả lời

17

Điều này là do xóa loại JVM. Tệp kê khai được giới thiệu để xử lý việc này, chúng gây ra thông tin loại được đính kèm với loại T. Điều này sẽ biên dịch:

def giveArray[T: Manifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

Có gần như câu hỏi trùng lặp về điều này. Hãy để tôi xem nếu tôi có thể đào lên. Xem http://www.scala-lang.org/docu/files/collections-api/collections_38.html để biết thêm chi tiết. Tôi xin trích dẫn (thay thế evenElems với elem trong trường hợp của bạn)

gì cần thiết ở đây là bạn giúp trình biên dịch ra bằng cách cung cấp một số gợi ý runtime gì tham số loại thực tế của evenElems là

Đặc biệt bạn cũng có thể sử dụng ClassManifest.

def giveArray[T: ClassManifest](elem:T):Array[T] = { 
    new Array[T](1) 
} 

câu hỏi tương tự:

+0

tôi cho rằng nó đã được hỏi nhiều lần trước đây nhưng tôi không thể tìm thấy bất cứ điều gì. Cảm ơn bạn đã trả lời một lần nữa :) –

+0

Oh Tôi chưa bao giờ trả lời câu hỏi này trước đây. Tôi hỏi cùng một câu hỏi một lúc trở lại :) Tôi nghĩ rằng trong trường hợp này bạn sẽ cuối cùng đã vấp vào nó nếu bạn tìm kiếm với "scala" và thông báo lỗi. – huynhjl

+3

Để chính xác hơn, điều này là do 'T' bị xóa nhưng mảng _ không phải là số_. Cũng cần lưu ý rằng 'ClassManifest' nhanh hơn. –

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