2011-11-29 76 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

嗯,所以我必须将值转换为我想要的值,因为清单并不是完全类型的?好的谢谢! –

相关问题