1

Fooオブジェクトを生成するメソッド(ファクトリメソッドのように機能する)を持つ抽象基本クラスがあるとします。現在、私のクラスは次のようになっています。

public class Foo
{
}

public class FooBar extends Foo
{
}

public abstract class MyBaseClass
{
    abstract public Foo createObject();
}

public class MyDerivedClass extends MyBaseClass
{
    @Override
    public Foo createObject()
    {
        return new FooBar();
    }
}

MyBaseClass#createObjectコード呼び出しは戻り値を元の値にキャストする必要があるため、これは最適ではありません。

FooBar fooBar = (FooBar)myDerivedClass.createObject();

これは、ズボンを脱いで再びズボンをはくようなものです。

私はしばらくの間Javaジェネリックを使用していませんが、その抽象メソッドを次のようなテンプレートメソッドに変換できることを望んでいました。

public abstract class MyBaseClass
{
    abstract public <T extends Foo> T createObject();
}

しかし、派生クラスにメソッドを実装しようとすると、Eclipseから次のエラーが発生します。

public class MyDerivedClass extends MyBaseClass
{
    @Override
    public <FooBar extends Foo> FooBar createObject() // The type parameter FooBar is hiding the type FooBar
    {
        return new FooBar(); // Cannot instantiate the type FooBar
    }
}

不必要なキャストを減らすという私の問題に正しい解決策を適用しているとは思いません。何か案は?

これはJava1.6の場合です。

4

1 に答える 1

3

あなたはおそらく(ジェネリックメソッドではなく)ジェネリッククラスを探しています:

public abstract class MyBaseClass<T extends Foo> {
    public abstract T createObject();
}

public class MyDerivcedClass extends MyBaseClass<FooBar> {
    public FooBar createObject() {
        return new FooBar();
    }
}

Javaジェネリックの詳細については、ジェネリックチュートリアルを読むことを強くお勧めします。

于 2012-05-02T01:03:18.240 に答える