如何查看地图类型?

时间:2011-10-12 08:26:38

标签: java google-closure-templates

我将模型中的数据设置为:

@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 个答案:

答案 0 :(得分:4)

您可以使用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
            );
        }
}

答案 1 :(得分:0)

您无法在Java中更改变量/参数的类型。您可以检查对象的类型,如果它符合您的条件,则按如下所示创建新类型的另一个变量

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

答案 2 :(得分:0)

修改SoyMapData位于model的{​​{1}}内。如果renderMethod1中的参数model引用同一个对象(然后renderMergedTemplateModel需要实现接口Model),则需要获取密钥Map处的对象

如果上述假设成立,

pageTitles

应该有用。

if (model.get("pageTitles") instanceof SoyMapData) { SoyMapData sModel = (SoyMapData)model.get("pageTitles"); } 用于检查实例的运行时类型:

instanceof