book_wayshall 2009-06-12 13:17
浏览 229
已采纳

ognl不支持泛型?

我为entity写了这样的接口


public interface Entity<T extends Serializable>{
public T getId();

public void setId(T id);

}



然后写了一个实现这个接口的user entity

public class User implements Entity<Long> {
private Long id;
private String name;

public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

}



然后当我用ognl设置user id 的值

User user = new User();
user.setName("test");
Ognl.setValue("id", user, "1");

运行这段代码总是抛错,说不能把string转换成Long类型
我发现问题的原因是,ognl读取user.id的write method时,得到的方法是

User.setId(java.io.Serializable)


而不是

User.setId(java.lang.Long)

所以ognl没有把字符串“1”转换成long型就直接转换调用user.setId方法了,所以抛出了java.lang.ClassCastException

有人遇到这种情况么?
怎么解决?
问题补充:
引用
泛型的规范里,好像只能用反射的方式得到<T extends Serializable>时,得到的是Serializable,而没有得到T,导致这种情况


引用

那按照上面的说法,能不能不用 T extends Serializable?直接一个T
因为Long 和 String 类型都是Serializable的啊


我试过了,也不行,我debug看到的ognl得到id的write methods是User.setId(java.lang.Object)

其实本来一直都工作好好的,后来就突然出现上面所说的错误了。
我测试了很久,发现出现了很多莫名其妙的情况,无法解释。
现在唯有抛弃这种泛型的设计了。
去掉了Entity接口,一切正常……
郁闷,实在搞不懂其中的缘故……
  • 写回答

4条回答 默认 最新

  • wanghaolovezlq 2009-06-12 14:55
    关注

    这还是泛型的规范问题,
    如果你直接用T的话,它能得到的确定类型就只有Object,

    你想想,对于这些一个类型T extends Serializable,没有明确指定类型之前,你是不可能知道T是什么类型,唯一能知道的就是T一定是Serializable类型,

    对于只有T的情况,有个隐式的继承啊T extends Object ,道理同上

    这样你应该就能理解OGNL为什么会出现这种情况

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器