2012-05-02 8 views
1

私はファクトリメソッドのように作用するFooオブジェクトを生成するメソッドを持つ抽象基底クラスがあります。抽象テンプレートメソッドとしてファクトリーのようなメソッド

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

これは次のとおりです。コードはすなわち、バックそれは、もともとあったものに戻り値をキャストするMyBaseClass#createObjectニーズを呼び出すため、

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(); 
    } 
} 

これは次善である:今私のクラスには、次のようになり私のズボンを外して、もう一度やり直すように。

は、私はしばらくの間、Javaのジェネリックを使用していないが、私は、テンプレートメソッドにその抽象メソッドを回すことができる期待していた、何かのように:私は、Eclipseから次のエラーを取得

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

しかし、ときに私派生クラスでメソッドを実装しよう:

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 
    } 
} 

私は私が起こって不要なキャストを削減する私の問題に適切なソリューションを適用していないと思います。何か案は?

これはJava 1.6の場合です。あなたはおそらく、(一般的な方法ではなく)一般的なクラスを探している

+0

おそらく、Javaジェネリックの消去の影響を理解する必要があります。 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – esej

+0

関連:http://stackoverflow.com/q/10127502/697449 –

答えて

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ジェネリックの詳細については、私は非常にあなたがGenerics tutorialを読むことをお勧め。

関連する問題