Как проверить тип карты? - PullRequest
       26

Как проверить тип карты?

1 голос
/ 12 октября 2011

Я устанавливаю данные в модели как:

@RequestMapping("/forms/builder/")
public void renderMethod1(Model model) {            
    SoyMapData x=new SoyMapData("class","menu horizontal right");
    model.addAttribute("pageTitles", x);        
}

Который отображается на функцию ниже через Spring:

@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
    String renderedResponse = null;
    renderedResponse = compiledSoyTemplates.render(templateName, model, messageBundle);
}

Здесь мне нужно проверить, имеет ли модель тип SoyMapData, если да, тогда установите тип модели на SoyMapData else map. Как я могу это сделать?

Я попробовал следующий подход, он не работает.

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

Вы можете сделать это с помощью оператора instanceof:

SoyMapData soyModel;
if (model instanceof SoyMapData) {
    // It is, get a reference using that type
    soyModel = (SoyMapData)model;
}

... но если вам нужно это сделать, это предполагает проблему с инкапсуляцией в дизайне API. Ваш render метод не должен знать, какой тип Map он получает, что нарушает инкапсуляцию.

Есть много способов решить это. Одним из них является получение нового интерфейса из Map, который позволяет render выполнять свою работу, а затем использование этого интерфейса вместо Map в сигнатуре метода. Но это только один способ.


Обновление : если вы обновили код, если я вас правильно понял, вы хотите вызвать compiledSoyTemplates.render с аргументом SoyDataModel или Map в зависимости от того, является ли model SoyDataModel. (Например, это перегруженный метод, и вы хотите, чтобы компилятор знал, какой из них использовать.) Если это так, то вы просто используете информацию, которую я дал вам выше, следующим образом:

@Override
protected void renderMergedTemplateModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
        String renderedResponse = null;
        if (model instanceof SoyDataModel) {
            renderedResponse = compiledSoyTemplates.render(
                templateName,
                (SoyDataModel)model,
                messageBundle
            );
        }
        else {
            renderedResponse = compiledSoyTemplates.render(
                templateName,
                model,
                messageBundle
            );
        }
}
0 голосов
/ 12 октября 2011

Редактировать: : SoyMapData находится внутри model в renderMethod1. Если параметр model в renderMergedTemplateModel ссылается на один и тот же объект (тогда Model необходимо реализовать интерфейс Map), вам необходимо получить объект по ключу pageTitles.

Если вышеприведенные предположения верны,

if (model.get("pageTitles") instanceof SoyMapData) {
  SoyMapData sModel = (SoyMapData)model.get("pageTitles");
}

должно работать.

instanceof используется для проверки типа времени выполнения экземпляра:

if (model instanceof SoyMapData) {
  SoyMapData sData = (SoyMapData)model;
  ...
} else {
  ...
}
0 голосов
/ 12 октября 2011

Вы не можете изменить тип переменной / параметра в Java. Вы можете проверить тип объекта и, если он соответствует вашим критериям, создать другую переменную нового типа следующим образом

if (model instanceof SoyMapData) {
   SoyMapData soyModel = (SoyMapData)model;
   ...
}
...