1

鉴于以下代码:

//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>

那么如何在这个 JSTL 标记中向下转换呢?

4

1 回答 1

3

你不需要沮丧。EL(注意:EL,不是 JSTL!)使用反射来查找方法。如果它不存在,那么它只会抛出一个PropertyNotFoundException.


更新:如果反过来又是您的实际问题(因此您错误地认为“在 JSTL 中向下转换”在某种程度上是正确的解决方案,因此您基本上问了错误的问题),那么您应该以不同的方式解决它:

  1. 只是不要在一个集合中混合不同的类型。

  2. 将其放入<c:catch>并吞下异常。

    <c:catch var="e">
        ${element.version}
    </c:catch>
    

    然而,这是糟糕的设计。

  3. 确定实例在<c:if>.

    <c:if test="${element['class'].simpleName == 'SubClass'}">
        ${element.version}
    </c:if>
    

    最好将它抽象出来,就像abstract Type getType()返回所需的枚举:

    <c:if test="${element.type == 'VERSIONABLE'}">
        ${element.version}
    </c:if>
    
于 2013-07-26T13:52:39.297 回答