1

在 Scala 中,我需要执行满足以下要求的代码:

将 a传递给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

我知道这只是一个语法问题——我该如何表达这个逻辑?

4

2 回答 2

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

这样你就不必显式地传入一个类对象——你只需用你想要的类型参数化方法。同样,我敢打赌有更好的方法来做到这一点,所以我很感谢那些在这方面有更多经验的人的反馈。

另外,我认为 Scala 2.10 已经放弃了 Manifests 以支持 ClassTags 或类似的东西......

于 2012-10-23T00:55:26.613 回答
2

你很接近:

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

abstract class Project
于 2012-10-23T00:55:27.237 回答