Почему код, который возвращает обобщенную карту, генерирует предупреждение компилятора при назначении общей карте?
У меня есть метод с этой подписью:
protected final Map<String, Object> buildOutputMappings(
AbstractDataObject ado, MDBase md)
И вызывается с помощью этого метода (в подклассе):
Map<String, Object> params = buildOutputMappings(ra, md);
Я получаю это предупреждение компилятора:
Warning:Warning:line (136)[unchecked] unchecked conversion
found : java.util.Map
required: java.util.Map<java.lang.String,java.lang.Object>
Изменение параметров на не сгенерированную карту удаляет предупреждение компилятора. Почему это и как этого можно избежать (кроме подавления)?
РЕДАКТИРОВАТЬ: Это JDK 1.5, и строка 136 является оператором присваивания выше. Ни один класс не является параметризованным, у них просто есть методы, которые возвращают карту универсального типа. Возвращенный объект в методе также генерируется.
РЕДАКТИРОВАТЬ: суперкласс действительно обобщенный, хотя возвращаемое значение не имеет ничего общего с этими обобщениями. Вот код метода, хотя с оговоркой, что я не написал это, и я знаю, что это некрасиво:
protected final Map<String, Object> buildOutputMappings(AbstractDataObject ado, MDBase md) throws DAOException {
try {
....
Map<String,Object> params = new HashMap<String, Object>(spc.getNumberInParams());
....
return params;
}
catch (Exception e) {
logger.undeterminedError(e);
throw new DAOException(e.getMessage(), e);
}
}
Вот объявления класса:
public abstract class DAOBase<T extends AbstractDataObject>
public class RoleAssignmentDAO extends DAOBase
2 ответа
Я предполагаю, что вы не используете обобщенные значения правильно в подклассе, а компилятор отключает обобщенные значения для класса. таким образом, тип возврата для вызова buildOutputMappings преобразуется в необработанный тип и генерируется предупреждение. родительский класс параметризован? Подкласс включает типы для параметров родительских классов?
Короче говоря, ваша ошибка, скорее всего, является опущенным параметром типа где-то в подклассе или родительском классе.
У меня такое ощущение, что ваш фактический оператор возврата не соответствует вашему возвращаемому типу, указанному в определении вашего метода. Я не могу быть уверен, потому что у вас нет кода.