Этот вопрос возникает в ответ на другой вопрос opensas: создание общей функции инициализации в java
Из его вопроса стало ясно, что ему нужно преобразовать из любого типа данных T1
в другой тип T2
. Когда я говорю "тип данных" здесь, я имею в виду типы, ограниченные теми, которые обычно используются для представления необработанных данных: Integer
, String
, Date
и т.д. В целях этого вопроса мы можем рассматривать примитивы, которые должны быть помещены в бокс.
Мне интересно, существует ли какой-либо API, который поддерживает преобразование между типами, где оба входа и вывода обобщаются на набор поддерживаемых типов данных. Я посмотрел пакет beanutils.converters Apache Commons, но есть отдельный класс преобразователя для каждого известного ввода. Я ищу любую функциональность, которая реализует что-то вроде следующей подписи:
static <IN, OUT> OUT convert(IN value, Class<OUT> targetType);
или еще
static <IN, OUT> OUT convert(IN value, OUT defaultValue);
На самом деле было бы не слишком сложно реализовать такой вид отображения, используя пучок блоков else if
, указывающих на различные Commons Converters, или же Map<Class<?>, Converter>
для этой же цели. Но мне интересно, поддерживается ли такая функциональность где-то.
Кроме того, если это приводит к дублированию, я приношу свои извинения. Я попытался найти похожие вопросы и был удивлен, когда не нашел подходящих для этой ситуации.
EDIT:, поэтому пример этого кода в действии:
Integer i = GenericConverter.convert("123", Integer.class); //returns 123
Date d = GenericConverter.convert(1313381772316L, Date.class); //returns today date
Boolean b = GenericConverter.convert(0, Boolean.class); //returns false
Long l = GenericConverter.convert("asdf", Long.class); //RuntimeException
ОБНОВЛЕНИЕ: Скомпонуемый мной код BalusC близок к знаку, а богемский ответ - хорошее облегченное решение (хотя оно не работает для логических преобразований). Он также прав, что Dates, вероятно, следует обрабатывать отдельно, если мы хотим обобщить преобразование этих других типов данных. Я все еще надеюсь на дополнительные ответы, хотя, особенно если есть более доступный API-интерфейс.