ATG - 覆盖方法和 return 更具体的组件

ATG - Override method and return more specific component

我正在尝试重写某些方法以使其更具体 return。所以我做到了。

@Override
public StoreProfile getProfile() {
    return (StoreProfile)super.getProfile();
}

但是,方法 super.getProfile() 在被覆盖时总是 return null。

我的环境具有以下规格。

.\java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b50)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

已编辑

通过更多测试,我发现这个问题不是 Java 问题。 我的项目使用 ATG 10.0.3,当我尝试重写 return 一个 component (并且只是组件)的某些方法并将其转换为更具体的 class.

看来你做错了什么。考虑这个例子:

public class SpecificSubclass {

    public static void main(String[] args) {
        Parent parent = new Parent();
        Number number = parent.getNumber();
        Integer integer = (Integer) number;
        System.out.println(integer);

        A a = new A();
        integer = a.getNumber();
        System.out.println(integer);
    }

    static class Parent {

        public Number getNumber() {
            return new Integer(1);
        }
    }

    static class A extends Parent {

        @Override
        public Integer getNumber() {
            return (Integer) super.getNumber();
        }
    }
}

输出为:

1
1

更具体的getNumber()方法class一个returns一个Integer,否则赋值

integer=a.getNumber();

不行。输出为“1”,不为空。因此,通过调用 super 和转换在覆盖方法中返回更具体的 subclass 的一般情况正常工作(假设 superclass 方法 returns 确实是 more 的一个实例具体子class).

您看到的是协变 Return 问题的示例,此处解释得很好:https://dzone.com/articles/covariant-return-type-abyssal

您看到的普通 Java 的不同之处在于 ATG 使用的是 JavaBeans。如果 JavaBeans 首先加载基础 class,它会同时看到 get 和 set 方法。如果 JavaBeans 首先加载 subclass,它会看到 getter 但没有相应的 setter(它在类型上不匹配,并且不在规范中检查基础classes)。由于这种依赖性,服务器启动中的微小变化可能会导致空值,您应该始终避免这个问题。

最好的解决办法是让你的子class的getter有一个不同的名字。根据您的示例,我将使用:

public StoreProfile getStoreProfile() {
    return (StoreProfile) getProfile();
}