2016-08-21 11 views
-1

私はそれぞれがそのスーパークラスの抽象メソッドを実装する抽象クラスの2つのサブクラスを持っています。これらの戻り値の型は別の抽象クラスのサブクラスになっていますが、それぞれ異なる戻り値の型が必要です。以下を参照してください:抽象メソッドの実装で抽象クラスのサブクラスを返すことはできません

public abstract class Gardener { 

    public abstract ArrayList<Flower> getFlowers(); 
} 

public class GardererA extends Gardener { 

    public ArrayList<Flower> getFlowers() { 
     return new ArrayList<Daisy>(); 
    } 
} 

public class GardererB extends Gardener { 

    public ArrayList<Flower> getFlowers() { 
     return new ArrayList<Rose>(); 
    } 
} 

public abstract class Flower {} 

public class Daisy extends Flower {} 

public class Rose extends Flower {} 

明らかにJavaは私にこれをさせませんが、私はこの機能を得る方法を失っています。何か案は?

+2

は、なぜあなたは、クラス名に ''()を入れていますか?それらはコンストラクタメソッドではありません。 – aastefanov

+0

私はたくさんのクラスを見ていて、たくさんのインターフェイスを見ていません。私は別のガードナーAとBを知る必要があるクライアントコードを見たいと思います。私はジェネリックスがあなたを助けるかもしれないと思っていますが、もっと詳細を知る必要があります。 – emeraldjava

+0

@aastfanovそれを指摘してくれてありがとう。私はそれを修正するために私の質問を編集しました。 –

答えて

6

ワイルドカードを使用:

public abstract class Gardener { 

    public abstract ArrayList<? extends Flower> getFlowers(); 

} 
+0

これは素晴らしい答えです! –

5

あなたはこのようにジェネリックを使用することができます。

public abstract class Gardener<T extends Flower> { 

    public abstract ArrayList<T> getFlowers(); 
} 

public class GardererA extends Gardener<Daisy> { 

    public ArrayList<Daisy> getFlowers() { 
     return new ArrayList<Daisy>(); 
    } 
} 

public class GardererB extends Gardener<Rose> { 

    public ArrayList<Rose> getFlowers() { 
     return new ArrayList<Rose>(); 
    } 
} 

public abstract class Flower {} 

public class Daisy extends Flower {} 

public class Rose extends Flower {} 
関連する問題