У меня есть полный тупик, и я поделюсь им со всеми, чтобы узнать, знаете ли вы, что происходит.
Это структура данных
Map<String, Object> objectMap
хранит строковые и числовые значения на данный момент, но может хранить больше типов в будущем.
Это функция, которую я использую для получения этих значений:
public <T> T get(String variable, T defaultValue) {
// returns either the object from the map, or the default if its not in the map.
Object value = getObject(variable, defaultValue);
logger.debug("default value is of type " + defaultValue.getClass().getName());
// Attempt to get around casting issue
if (value instanceof Number)
{
value = (Number) value;
}
T ret = (T) value;
logger.debug("Variable " + variable + " which is of type " + value.getClass().getName() + " and returning as " + ret.getClass().getName() + " (is number: " + (value instanceof Number) + ")");
return ret;
}
И это код вызова:
public int getFoo() { return this.<Integer>get("foo", 0); }
Это вывод, который я вижу в журналах:
default value is of type java.lang.Integer
Variable foo which is of type java.lang.Long and returning as java.lang.Long (is number: true)
Прямо перед тем, как он потерпит неудачу с:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
Что меня больше всего беспокоит, так это то, что тип класса выглядит как Long, несмотря на попытку заставить класс использовать Integer .
Я что-то упускаю или нарушаю какую-то концепцию обобщения Java?
Спасибо за любую помощь