如何在方法中表达类型的参数界限



在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

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

您需要在方法名称之后声明类型参数,而不是在使用网站上:

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已删除了有利于classtags或类似的东西...

您很接近:

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

最新更新