littleQ

终于明白曾经他们失落的目光,当年的你们是否一样;间有懈怠或有颓放,难知多久方能补上;今起,不再彷徨!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  33 Posts :: 0 Stories :: 60 Comments :: 0 Trackbacks

Velocity的比较本来很简单,只是它在比较基本类型的时候,不仅比较值是否相等,还会比较类型是否相同。
拿个很简单的例子来说一下:

VelocityContext context = new VelocityContext();
long aLong = 1234L
;
context.put(
"aLong", aLong);


在velocity页面里,进行一个比较:

#if($!aLong==1234)
    类型比较成功
#else
    比较失败
#end

页面肯定会打印出"比较失败".因为在velocity中获取的变量aLong是long类型,而数字1234是默认为int类型的。虽然值相等,可是类型不同。
在velocity里,好像没有方法进行基础类型之间的强制转换,如果你知道的话,请回帖告诉我们。
那现在问题摆在这里,我们想看到"类型比较成功",应该怎么做呢?

修改java代码,把变量aLong强制转换成int类型:

context.put("aLong",(int)aLong).


不过我不是很赞成这种做法,从long强制转换成int类型,很容易造成精度丢失。
还有一种比较直接的方法,不修改java代码,直接修改vm文件:

#if("$!aLong"=="1234")
    类型比较成功
#else
    比较失败
#end


把两边都变成了String类型,就不会出现类型比较失败的情况了。
认识比较肤浅表面,还希望大家多指点一下。

posted on 2008-09-27 10:08 littleQ 阅读(4085) 评论(7)  编辑  收藏 所属分类: java

Feedback

# re: velocity的类型比较[未登录] 2008-09-28 09:33 henry1451
思路是可以的,
在Velocity的比较中,还有关于true,false等的比较,也会有类似的情况.  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 10:28 隔叶黄莺
我用的是 Velocity 1.5,执行的结果是

类型比较成功

不知道你用的 Velocity 版本是什么  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 10:37 隔叶黄莺
long aLong = 1234L;
context.put("aLong", aLong);

调用的是 context.put(String, Object) 方法,所以 aLong 用自动装箱成 Long 类型。  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 11:30 littleQ
@隔叶黄莺
恩,我默认用的1.4  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 11:32 littleQ
@隔叶黄莺
自动装箱我知道,但是在vm里获取这个变量,是装箱后的Long类型,还是会还原成基础类型long?  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 16:41 隔叶黄莺
解决办法有:
换成 1.5 的 Velocity
1.4 的 Velocity 中的
if (left.getClass().equals( right.getClass() ) )
{
return left.equals( right );
}
1.5 Velocity 的 ASTNotNode.evaluate(InternalContextAdapter context) 可比 1.4 考虑的周详多了。  回复  更多评论
  

# re: velocity的类型比较 2008-09-28 17:03 littleQ
@隔叶黄莺
恩~谢谢隔叶黄莺~  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: