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の場合です。