общая строка Java для парсера <T> - PullRequest
8 голосов
/ 31 марта 2012

Есть ли прямой способ реализации метода со следующей сигнатурой? Как минимум, реализация должна обрабатывать примитивные типы (например, Double и Integer). Непримитивные типы были бы хорошим бонусом.

//Attempt to instantiate an object of type T from the given input string
//Return a default value if parsing fails   
static <T> T fromString(String input, T defaultValue)

Реализация была бы тривиальной для объектов, которые реализовали интерфейс FromString (или эквивалентный), но я не нашел ничего подобного. Я также не нашел функциональную реализацию, которая использует отражение.

Ответы [ 3 ]

6 голосов
/ 31 марта 2012

Это возможно, только если вы укажите Class<T> в качестве другого аргумента.Сам по себе T не содержит никакой информации о желаемом типе возвращаемого значения.

static <T> T fromString(String input, Class<T> type, T defaultValue)

Тогда вы можете определить тип по type.Конкретный пример можно найти в этой статье блога .

1 голос
/ 31 марта 2012

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

interface Parser<T> {
    T fromString(String str, T dftl);
}

Одиночные типы абстрактных методов должны быть менее подробными для реализации в Java SE 8.

0 голосов
/ 04 мая 2014

Возможно, не отвечая на вопрос о том, как реализовать решение, но есть библиотека, которая делает именно это (то есть имеет почти идентичный API в соответствии с запросом).Он называется type-parser и может быть использован примерно так:

TypeParser parser = TypeParser.newBuilder().build();

Integer i = parser.parse("1", Integer.class);
int i2 = parser.parse("42", int.class);
File f = parser.parse("/some/path", File.class);

Set<Integer> setOfInts = parser.parse("1,2,3,4", new GenericType<Set<Integer>>() {});
List<Boolean> listOfBooleans = parser.parse("true, false", new GenericType<List<Boolean>>() {});
float[] arrayOfFloat = parser.parse("1.3, .4, 3.56", float[].class);
...