2011-11-29 69 views
3

我有下面的代碼的方法:創建接收類型參數,但不是作爲一個參數,就像classOf

class ServletSpec extends Specification { 

    def createServlet[T <: HttpServlet](clazz: Class[T]): T = { 

     val instance = clazz.newInstance() 
     instance.init() 

     instance 

    } 

} 

那個叫這樣的:

spec.createServlet(classOf[DocumentationServlet]) 

我如何定義這種方法,這樣我可以這樣調用:

spec.createServlet[DocumentationServlet] 

回答

5

使用艙單:

class ServletSpec extends Specification { 
    def createServlet[T <: HttpServlet]()(implicit manifest: Manifest[T]) = { 
     val instance = manifest.erasure.newInstance().asInstanceOf[T] 
     instance.init() 

     instance 
    } 
} 

new ServletSpec().createServlet[DocumentationServlet]() 

隱式參數由編譯器填充,Manifest包含創建新實例所需的類型信息。欲瞭解更多信息,請參閱What is a Manifest in Scala and when do you need it?

+0

不適用於我,manifest.erasure是Class [_]而不是Class [HttpServlet]。我在這裏錯過了什麼嗎? –

+0

對不起,錯過了.asInstanceOf,請參閱val實例行 –

+0

嗯,所以我必須將值轉換爲我想要的值,因爲清單並不是完全類型的?好的謝謝! –

相關問題