我为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接口,一切正常……
郁闷,实在搞不懂其中的缘故……