2009-09-03 2 views
2

Просто интересно, можете ли вы помочь мне с моей проблемой. Вероятно, это произошло благодаря тому, что я не знал правильных ключевых слов для поиска.Как создать экземпляр (внутри метода) разных классов, реализующих один и тот же интерфейс?

Это не домашнее задание, просто анонимный ...

У меня есть интерфейс и куча внедряющих классов:

interface Fruit 
Banana implements Fruit 
Apple implements Fruit 
.... 

У меня есть утилиты класс Fruit. В этом есть метод, который принимает любой Фрут и нарезает его.

public static Fruit[] slice(Fruit f, int pieces) 

Как я могу объявить массив Фруктов того же типа, что и Фрукты, которые я передаю методу?

т.е. Как можно автоматизировать:

Fruit[] a = new Apple[pieces]; 

если я дам это яблоко?

.

редактировать: осветление

Я буду иметь такой код:

Fruit a = new Apple(); 
Fruit b = new Banana(); 
Fruit[] slices1 = FruitUtil.slice(a, 3); //slices1 should be an Apple 
Fruit[] slices2 = FruitUtil.slice(b, 3); //slices2 should be a Banana 
Fruit newApple = FruitUtil.copy(a); //newApple should be an Apple 

Как я пишу ломтик (фрукты F, ИНТ срез) или копия (фрукты е) метод таким образом, что я создаю тот же тип Fruit, что и в аргументах (без необходимости переопределять метод для каждого типа или делать проверки экземпляра)

+0

не «Фрукты [] а = новые компании Apple [штук]; " достаточно? Он должен работать уже. Или я не получаю ваш вопрос? –

+0

Добавлены некоторые разъяснения для вас .. – masher

ответ

6

Во-первых, я предлагаю отказаться от массивов ссылок. Вместо этого используйте List. Тогда это относительно просто:

public static <T extends Fruit> List<T> slice(T fruit, int pieces) 
1

В качестве альтернативы вы можете использовать отражение: Array.newInstance (f.getClass(), штук)