2016-08-21 2 views
-1

У меня есть два подкласса абстрактного класса, каждый из которых реализует абстрактный метод своего суперкласса. Я хочу иметь другой тип возврата для каждого, хотя эти типы возвращаемого типа в свою очередь являются подклассами другого абстрактного класса. Смотрите ниже:Не удается вернуть подклассы абстрактного класса в реализации абстрактного метода

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

@aastefanov благодарит за это. Я отредактировал мой вопрос, чтобы исправить это. –

ответ

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 {} 
Смежные вопросы