一尘不染

Java EL通过整数键访问映射值

java

我有一个以整数为键的地图。使用EL,如何通过其键访问值?

Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

我以为这可以工作,但是不行(请求的属性中已经有map了):

<c:out value="${map[1]}"/>

跟进:我找到了问题所在。显然${name[1]}使用数字作为进行地图查找Long。当我更改HashMapTreeMap并收到错误时,我发现了这一点:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

如果我将地图更改为:

Map<Long, String> map = new HashMap<Long, String>();
map.put(1L, "One");

然后${name[1]}返回“一个”。那是什么 为什么<c:out>将数字视为长号。对我来说似乎违反直觉(因为int比long更常用)。

所以我的新问题是,是否有一个EL表示法可通过Integer值访问映射?


阅读 328

收藏
2020-03-13

共1个答案

一尘不染

如本Java论坛主题所述:

基本上,自动装箱会将Integer对象放入Map中。即:

map.put(new Integer(0), "myValue")

EL(表达式语言)将0评估为Long,因此在地图中寻找Long作为键。即它评估:

map.get(new Long(0))

由于a Long永远不等于Integer对象,因此不会在地图中找到该条目。
简而言之就是这样。

EL 2.2与JSP 2.2 / Java EE 6一起推出,与EL 2.1相比有一些区别。
似乎(“ EL表达式将整数解析为长 ”)是:

你可以在EL 2.2内部intValue的Long对象self 上调用该方法:

<c:out value="${map[(1).intValue()]}"/>
2020-03-13