Определить тип объекта в ArrayList - PullRequest
2 голосов
/ 24 июня 2009

Я пытаюсь создать класс, который будет конвертировать ArrayLists объектов в ArrayLists других объектов. т.е.

ArrayList<Foo> convert(ArrayList<Bar> input){
     //conversion logic
}

ArrayList<Bar> convert(ArrayList<Foo> input){
     //conversion logic
}

К сожалению, Java не хочет иметь две функции с одинаковым именем и тем, что считает одинаковыми входами и выходами.

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

ArrayList convert(ArrayList input){
     //conversion logic for Foo

     //conversion logic for Bar
}

Возможно ли что-то подобное?

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Попробуйте:

public <T, U> ArrayList<U> convert(Class<T> typeIn, ArrayList<T> input){     
    // dispatch on typeIn
}

Или еще лучше

public <T, U, V extends ArrayList<U>> V convert(Class<T> typeIn, 
Class<V> typeOut, ArrayList<T> input){     
    // dispatch on typeIn
    return typeOut.cast(yourConversionResult);
}

Поскольку вы можете вернуть ArrayList<Foo> или ArrayList<Bar> в том же методе, и правильное приведение поможет вам вернуть их без предупреждений компилятора.

Редактировать: Приведение типа возврата для второго образца не сработало. Пытался это исправить

4 голосов
/ 24 июня 2009

Как насчет интерфейса:

public class Converter<From, To> {
    List<To> convert(List<From> input);
}

А потом имейте столько реализаций, сколько захотите. Например:

private static final Converter<Foo, Bar> fooToBarConverter = new Converter<Foo, Bar>() {
    public List<Bar> convert(List<Foo> input) {
        ...
    }
}
0 голосов
/ 24 июня 2009

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

Суть решения (аналогично решению mmeyers):

public interface Function<From,To> {
  public To apply(From);
}

public <From,To> List<To> map(List<From> fromList, Function<From,To> fun)  {
  // call fun.apply() on every element in fromList and return a new result list ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...