Как полагал сам автор: Optional<>
здесь не вариант, потому что, как показывает другой ответ: это приведет к возвращению Optional<Object>
, что дает даже меньше информации о типе.
Но, честно говоря, с точки зрения чистого кода, даже идея
public static <T> T readFromConfig(String keyName) {
является своего рода ущербным . Что покупает этот метод? Ничего . Потому что звонящий говорит: я ожидаю, что Integer вернется, но вы отбрасываете Double или даже String. Видите ли, компилятору сообщают, что «метод должен возвращать Integer или Double, ...», а затем он видит: «да, возможно». Но это полностью отделено от того, что происходит во время выполнения.
Если вы идете:
Integer intVal = readFromConfig("keyPointingToDoubleValue");
компилятор не будет жаловаться. Потому что он видит: вы хотите целое число; и эй, метод может вернуть целое число.
во время выполнения? Когда значение извлекается и не является целым числом, возвращается значение Double или String. Понятия не имею, что здесь произойдет (исключение приведения класса или, возможно, какое-то нарушение стека). Но он должен не работать во время выполнения.
Итак, решение real выглядит следующим образом:
Либо у вас есть несколько методов, таких как:
public static Integer readIntegerFromConfig(String keyName) throws SomeException ...
public static Integer readIntegerFromConfig(String keyName, Integer Default) throws SomeException ...
Или, может быть:
public static Object readFromConfig(String keyName) {
или
public static <T> T readFromConfig(String keyName, T default)
Другими словами: вам нужен API, который позволяет пользователям действительно говорить, что они хотят, и всегда давать им то, что они хотят. Или вы полностью избегаете различных типов на этом уровне и возвращаете Strings, и клиентский код выполняет преобразования.
Ваш нынешний подход, как сказано: ничего не покупает, за счет вводящего в заблуждение сложного API.