是什么currObj
?您可以将其currVal
成员重新定义为Long
(或long
)吗?
数字文字(匹配IntegerLiteral
EL 语法中的产生式)将表示为Long
. 该表达式的currObj.currVal
计算结果为Integer
。A Long
never equals()
an Integer
,因此一个表达式必须产生不同的类型。
本质上,您需要的是显式类型转换。EL 中没有内置这样的功能,但您可以创建一个自定义 EL 函数来为您完成。这是您在 Java 中实现的静态函数,然后在 TLD 中进行描述。我的另一个答案给出了一个包装的例子。以下是您的情况下的功能及其用法。
package com.y.taglib.core;
public final class CoercionUtil {
public static Long toLong(Long n) {
return n;
}
}
TLD 如下所示:
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>x-c</short-name>
<uri>http://dev.y.com/taglib/core/1.0</uri>
<function>
<description>Coerce to a java.lang.Long.</description>
<display-name>long</display-name>
<name>long</name>
<function-class>com.y.taglib.core.CoercionUtil</function-class>
<function-signature>java.lang.Long toLong(java.lang.Long)</function-signature>
</function>
</taglib>
在您的 JSP 中:
<%@taglib uri="http://dev.y.com/taglib/core/1.0" prefix="my" %>
...
<c:if test='${ ! empty testMap[my:long(currObj.currVal)]}'>
JSP 引擎负责必要的类型强制(从方法的Integer
结果currVal
到Long
所需的toLong()
类型。您的方法只是为了指示所需的类型;没有它,JSP 引擎会看到参数的(已删除)类型testMap.get(Object)
,并且认为不需要执行任何强制,因为Integer
is-an Object
。