ATG - 覆盖方法并返回更具体的组件

时间:2017-03-22 14:33:19

标签: java atg

我尝试覆盖某种方法,让它具有更具体的回报。所以我做到了。

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

但是,方法super.getProfile()在被覆盖时始终返回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,当我尝试覆盖一些返回组件(和组件)的方法并将其转换为更具体的类时,就会出现问题。

2 个答案:

答案 0 :(得分:3)

您正在看一个Covariant Return问题的示例,请在此处解释:https://dzone.com/articles/covariant-return-type-abyssal

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

最好的解决方案是让您的子类的getter具有不同的名称。根据您的示例,我会使用:

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

答案 1 :(得分:0)

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

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

A类更具体的getNumber()方法会返回Integer,否则会返回

integer=a.getNumber();

无效。输出是' 1'而不是null。因此,通过调用super和cast可以正确地返回一个覆盖方法中更具体的子类的一般情况(假设超类方法返回的内容确实是更具体的子类的实例)。