2010-08-20 39 views
5

Tôi đã chơi với việc tạo ra một nhà máy chung như sau:Có cách nào trong scala để tạo ra một cá thể chung mà không có một cá thể ví dụ?

trait Factory[T] { def createInstance():T = new T() } 
val dateFactory = new Factory[Date](){} 
val myDate = dateFactory.createInstance() 

Các 'T mới()' không biên dịch, như T là undefined đến khi thời gian chạy. Tôi biết rằng tôi có thể làm cho nó hoạt động bằng cách đưa vào một cá thể của lớp với một số phương thức (ví dụ createInstance (classOf [Date]))

Tôi hỏi nếu có một số ma thuật nội tâm có thể thay thế 'T mới() 'để tôi có thể tạo nhà máy siêu đơn giản của mình?

Trả lời

10

này sẽ làm việc:

class Factory[T : ClassManifest] { 
    def 
    createInstance(): T = 
    (implicitly[ClassManifest[T]]).erasure.newInstance.asInstanceOf[T] 
} 

nếu lớp mà nó được khởi tạo có một mặc định (zero-arg) constructor.

+0

Tôi sẽ đưa ra câu trả lời tuyệt vời này như là một đầu mối rằng nó không thể được thực hiện với một đặc điểm. –

+0

Xin lỗi, tôi nên chỉ ra điều đó. "các đặc điểm không thể có các tham số kiểu với các giới hạn ngữ cảnh" (quoth trình biên dịch) –

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