Подстановочные знаки действительны только как тип параметры , а не как типы.В этом случае, как вы заметили, старый Object
так же хорош.
Другой действительной подписью будет:
public static <IN, OUT> OUT initialize(IN o, OUT default) { ... }
Но в вашем случае это выглядит ненужным, посколькууниверсальные типы не ограничены.
Что касается вашей стратегии конверсии с использованием приведения в пределах try / catch, я не уверен в этом.Кто-то должен взвесить эту часть.
РЕДАКТИРОВАТЬ: как вы обнаружили, приведение очень ограничено, когда речь идет о всех, кроме самых простых преобразований данных.Возможно, вам потребуется реализовать сопоставления с соответствующими вызовами методов синтаксического анализа в зависимости от типов ввода и вывода.
EDIT2: в качестве примера того, с чем вы сталкиваетесь, вот метод преобразования данныхкто-то написал для проекта, в котором я сейчас участвую:
public static <T> T mapValueString(String valueString, Class<T> targetType) {
if (valueString == null) {
return null;
}
else if(targetType.equals(String.class)) {
return (T)valueString;
}
else if (targetType.equals(Date.class)) {
return (T)MyDateTime.parseDate(valueString);
}
else if (targetType.equals(Timestamp.class)) {
return (T)MyDateTime.parseTimestamp(valueString);
}
else if (targetType.equals(Boolean.class)) {
String upperVal = valueString.toUpperCase();
if (upperVal.startsWith("T")) {
return (T)Boolean.TRUE;
}
else if (upperVal.startsWith("F")) {
return (T)Boolean.FALSE;
}
else {
throw new RuntimeException("Failed to parse value string into Boolean object. String was " + valueString + ".");
}
}
else if (targetType.equals(Integer.class)) {
Integer i;
try {
i = Integer.parseInt(valueString);
}
catch (NumberFormatException nfe) {
throw new RuntimeException("Failed to parse value string into Integer object. String was " + valueString + ".", nfe);
}
return (T)i;
}
else if (targetType.equals(Long.class)) {
Long l;
try {
l = Long.parseLong(valueString);
}
catch (NumberFormatException nfe) {
throw new RuntimeException("Failed to parse value string into Long object. String was " + valueString + ".", nfe);
}
return (T)l;
}
else if (targetType.equals(Double.class)) {
Double d;
try {
d = Double.parseDouble(valueString);
}
catch (NumberFormatException nfe) {
throw new RuntimeException("Failed to parse value string into Double object. String was " + valueString + ".", nfe);
}
return (T)d;
}
else {
throw new RuntimeException("Unsupported java type " + targetType.getName() + ".");
}
}
Обратите внимание, что это только для отображения String
в T
, где вы хотите отобразить T1
в T2
.Есть ли способ лучше?Может быть.Может ли ТА помочь вам найти правильную стратегию?Конечно, но мяч на вашей площадке, чтобы задавать правильные вопросы.
EDIT3: Apache Commons 'beanutils.converters может помочь.Я не пробовал это, хотя, поэтому я не могу отметить это.