Java 使用EL向下投射
鉴于以下代码:Java 使用EL向下投射,java,inheritance,casting,jstl,el,Java,Inheritance,Casting,Jstl,El,鉴于以下代码: //super class public class SuperClass { protected String name; public SuperClass(String name){ this.name = name; } public String getData(){ return "superclass" + name; } } //s
//super class
public class SuperClass {
protected String name;
public SuperClass(String name){
this.name = name;
}
public String getData(){
return "superclass" + name;
}
}
//subclass
public class SubClass extends SuperClass {
private String version;
public SubClass(String name) {
super(name);
}
public String getData() {
return "subclass" + name;
}
public String getVersion(){
return version;
}
}
我想要的是使用EL和JSTL代码在我的jsp文件中获取版本(使用子类的getVersion()方法):
<c:forEach items="${listSuperClass}" var = "element">
${element.version}
</c:forEach>
${element.version}
那么如何在这个JSTL标记中向下转换呢?您不需要向下转换。EL(!)用于查找方法。如果它不存在,那么它只会抛出一个
PropertyNotFoundException
更新:如果这又是您的实际问题(因此您错误地认为“JSTL中的向下播放”在某种程度上是正确的解决方案,因此您基本上提出了错误的问题),那么您应该以不同的方式解决它:
中,并吞下异常
${element.version}
然而,这是一个糟糕的设计
中确定实例的实际类型
${element.version}
最好像abstract Type getType()
返回所需的枚举那样将其抽象掉:
${element.version}
如果你有一个
子类2
?我的version属性只在一个子类中需要,这就是为什么我没有把它放在超类中,我不明白你说的另一个子类是什么意思。我希望你知道如何处理这样的情况:你从列表中得到一个实例,它不是子类的类型,也没有这个属性。是的,这就是我提出这个问题的原因,我认为解决方案是向下转换的,我不知道如何使用JSLTYes进行向下转换。它会引发以下错误:javax.el.PropertyNotFoundException,那么我应该怎么做才能避免这种情况呢?我应该将抽象类型getType()代码放在哪里?我忘了注意到,由于我们的设计限制,我不能修改我的超类代码,因为如果我想修改它,我只需要在我的超类中放入getVersion()方法来解决这个问题。如果由于某些不清楚的原因,您不能编辑模型,也不能对其进行子类化/包装,那么您就不走运了。