如何在方法中表达类型参数边界?

时间:2012-10-23 00:50:53

标签: scala

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

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

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

2 个答案:

答案 0 :(得分:6)

您需要在方法名称后声明type参数,而不是在使用站点:

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已经放弃了Manifest而支持ClassTags或类似的东西......

答案 1 :(得分:2)

你很亲密:

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

abstract class Project