Почему код, который возвращает обобщенную карту, генерирует предупреждение компилятора при назначении общей карте?

У меня есть метод с этой подписью:

   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 преобразуется в необработанный тип и генерируется предупреждение. родительский класс параметризован? Подкласс включает типы для параметров родительских классов?

Короче говоря, ваша ошибка, скорее всего, является опущенным параметром типа где-то в подклассе или родительском классе.

У меня такое ощущение, что ваш фактический оператор возврата не соответствует вашему возвращаемому типу, указанному в определении вашего метода. Я не могу быть уверен, потому что у вас нет кода.

Другие вопросы по тегам