Я использую библиотеку, которая содержит абстрактный общий оформленной класс:Java - Общий список общих абстрактных классов
public abstract class Parsable<T> {
T parse(String s);
}
Наследуя этот класс позволяет пользователям создавать экземпляры типов из строк. Мне приходится анализировать списки объектов. Например, может существовать IntParser extends Parsable<Integer>
, и я хочу реализовать IntListParser extends Parsable<List<Integer>>
. Это можно сделать довольно просто:
public class IntListParser extends Parsable<List<Integer>> {
List<Integer> parse(String s) {
IntParser ip = new IntParser();
String[] strings = s.split(",");
List<Integer> result;
for (String s : strings) {
result.add(ip.parse(s));
}
return result;
}
}
Это может быть сделано успешно для каждого типа синтаксического анализатора. В этом примере нет ничего особенного в Integer. После написания нескольких из этих одинаковых классов я решил, что пришло время создать родовое, чтобы сделать это:
public class GenericListParser<TParser extends Parsable<T>> extends Parsable<List<T>> {
List<T> parse(String s) {
TParser tp = new TParser();
String[] strings = s.split(",");
List<T> result;
for (String s : strings) {
result.add(tp.parse(s));
}
return result;
}
}
К сожалению, это не работает, потому что команда new TParser()
не компилируется. Есть ли способ обойти это или я вынужден создать новую копию этого кода для каждого типа Parser?
Решения, которые я пытался это не сработало, являются:
- Создание синтаксического анализа статической. Это предотвратит создание экземпляров
Parsables
, но это не сработает, потому что вы не можете создавать абстрактные статические функции. - Идет
GenericListParser<TParser extends Parsable<T>>
ПродолжитьParsable<T>
вместоParsable<List<T>>
. Это позволит его функцииparse
вызывать функцию разбораParsable<T>
, потому что это ее собственный супер. Это не работает, потому что возвращаемый тип анализа равенT
, и вы не можете отличитьList<T>
вT
.