在Scala中,我需要执行满足以下要求的代码:
java.lang.Class将a 传递给工厂方法.传递给此方法的类必须扩展抽象类Project.我将实例化这个类,执行各种操作,然后返回它.
这是我的...
object ProjectFactory {
def create (clazz: java.lang.Class[T <: Project]): Project = {
val newProject = clazz.newInstance
/* snip */
newProject
}
}
abstract class Project
Run Code Online (Sandbox Code Playgroud)
......这是我得到的错误:
identifier expected but <: found
Run Code Online (Sandbox Code Playgroud)
我知道这只是一个语法问题 - 我如何表达这种逻辑?
您需要在方法名称后面声明type参数,而不是在使用站点:
object ProjectFactory {
def create[T <: Project](clazz: java.lang.Class[T]): Project = {
val newProject = clazz.newInstance
/* snip */
newProject
}
}
abstract class Project
Run Code Online (Sandbox Code Playgroud)
我不是Scala反射库的专家,但我认为这可能更清晰:
object ProjectFactory {
def create[T <: Project: Manifest]: Project = {
val newProject = classManifest[T].erasure.newInstance.asInstanceOf[Project]
/* snip */
newProject
}
}
abstract class Project
Run Code Online (Sandbox Code Playgroud)
这样您就不必显式传入类对象 - 您只需使用所需类型参数化方法.再说一次,我敢打赌有更好的方法可以做到这一点,所以我很感激那些在这方面有更多经验的人的反馈.
另外,我认为Scala 2.10已经放弃了Manifest而支持ClassTags或类似的东西......
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |