1

Scala では、次の要件を満たすコードを実行する必要があります。

java.lang.Classaをファクトリ メソッドに渡します。このメソッドに渡されるクラスは、抽象クラスを拡張する必要があり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 では 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 に答える