2012-03-30 2 views
8

Есть ли прямой способ реализовать метод со следующей подписью? Как минимум, реализация должна обрабатывать примитивные типы (например, Double и Integer). Непримитивные типы были бы приятным бонусом.java generic String to <T> parser

//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 (или эквивалент), но я не нашел ничего подобного. Я также не нашел функциональную реализацию, которая использует отражение.

+0

Почему вы пытаетесь вернуть ' T' вместо просто' Т *? – Makoto

+0

@Makoto Это общий метод. '' объявляет переменную типа для метода. Тип возврата объявляется просто как 'T'. – erickson

+0

Достаточно честный. Теперь я понимаю, спасибо. – Makoto

ответ

5

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

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

Затем вы можете вычислить тип по type. Конкретный пример можно найти в this blog article.

+2

Да, тип будет необходим, если API не требует, чтобы 'defaultValue' был непустым. –

+0

@ DilumRanatunga Можете ли вы уточнить? Я вижу, как прохождение нулевого значения сделает вывод типа невозможным, но я не вижу, как он решит проблему определения конкретного типа T. – cqcallaw

+1

Используйте 'defaultValue.getClass()', чтобы получить тип как ' Класс '. – BalusC

1

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

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

типа Single абстрактный метод, следует надеяться быть менее многословным реализовать в Java SE 8.

+0

К счастью, тонкий контроль над синтаксическими механизмами не нужен для моих целей. Достаточно вернуться к значению по умолчанию, если синтаксический анализ не завершится. – cqcallaw

0

Возможно, не отвечая на вопрос, как реализовать решение, но есть библиотека, которая делает именно это (т.е. имеет почти идентичный 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);