2012-10-23 79 views
1

在斯卡拉,我需要執行的代碼滿足以下要求:如何在方法中表示類型參數範圍?

java.lang.Class傳遞給工廠方法。傳遞給此方法的類必須擴展抽象類Project。我將實例化這個類,執行各種操作並將其返回。

這裏就是我有...

object ProjectFactory { 

    def create (clazz: java.lang.Class[T <: Project]): Project = { 
     val newProject = clazz.newInstance 
     /* snip */ 
     newProject 
    } 

} 

abstract class Project 

...這裏是我得到的錯誤:

identifier expected but <: found 

我知道這只是一個語法的問題 - 如何表達這個邏輯?

回答

6

您需要的方法名稱後聲明的類型參數,而不是在使用場所:

object ProjectFactory { 

    def create[T <: Project](clazz: java.lang.Class[T]): Project = { 
     val newProject = clazz.newInstance 
     /* snip */ 
     newProject 
    } 

} 

abstract class Project 

我不是Scala的反射庫的專家,但我認爲這可能是更清潔:

object ProjectFactory { 

    def create[T <: Project: Manifest]: Project = { 
     val newProject = classManifest[T].erasure.newInstance.asInstanceOf[Project] 
     /* snip */ 
     newProject 
    } 

} 

abstract class Project 

這樣你就不必顯式傳入一個類對象 - 你只需要用你想要的類型參數化該方法。再次,我敢打賭有更好的方法來做到這一點,所以我會很感激那些在這方面有更多經驗的人的反饋。

另外,我覺得斯卡拉2.10贊成ClassTags的或類似的東西已經下降艙單...

2

你接近:

object ProjectFactory { 
    def create[T <: Project](clazz: java.lang.Class[T]): Project = { 
     val newProject = clazz.newInstance 
     /* snip */ 
     newProject 
    } 
} 

abstract class Project 
相關問題