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()方法来解决这个问题。如果由于某些不清楚的原因,您不能编辑模型,也不能对其进行子类化/包装,那么您就不走运了。