Есть несколько подходов, которые вы можете использовать.Одним из них является использование Class<T>
, как предлагали другие.Другим было бы создать некоторый интерфейс производителя и передать его в:
public interface FruitProducer<T> {
T createFruit(String arg);
}
public <T> List<T> returnFruits(String arg, FruitProducer<? extends T> producer) {
List<T> list = new ArrayList<T>();
T fruit = producer.createFruit(arg);
list.add(fruit);
return list;
}
У вас есть разные производители для разных фруктов: AppleProducer implements FruitProducer<Apple>
, OrangeProducer implements FruitProducer<Orange>
и т. Д. Этот подход просто пинает банкунемного - FruitProducer
все еще должен как-то создавать плоды - но это может быть полезным рефакторингом.
Еще один подход основан на том же полиморфизме, что и подход FruitProducer
, делая класс с returnFruits
аннотация:
public abstract class FruitLister<T> {
public abstract List<T> returnFruits(String arg);
}
Теперь у вас есть разные списки: AppleLister implements FruitLister<Apple>
и т. Д. Каждый знает, как создавать конкретные классы, которые ему нужно вернуть в список:
public class AppleLister implements FruitLister<Apple> {
@Override
public List<Apple> returnFruits(String arg) {
List<Apple> list = new ArrayList<Apple>();
Apple apple = new Apple(arg);
list.add(apple);
return list;
}
}