【问题标题】:ATG - Override method and return more specific componentATG - 覆盖方法并返回更具体的组件
【发布时间】:2017-03-22 14:33:18
【问题描述】:

我正在尝试覆盖某些方法以使其具有更具体的返回。所以我做到了。

@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,当我尝试覆盖一些返回 component(并且只是组件)的方法并将其转换为更具体的类时,就会出现这个问题。

【问题讨论】:

  • 你有什么问题?
  • 不覆盖方法会得到非空值吗?
  • @StefanWarminski 是的,如果我不覆盖该方法,则返回非空
  • 它不会返回父类返回的任何方法getProfile(),因为调用了super?父级的getProfile() 返回什么?
  • 您需要附加更多代码以让我们了解一些上下文。听起来你做错了什么。

标签: java atg


【解决方案1】:

您看到的是协变返回问题的示例,在此处进行了很好的解释:https://dzone.com/articles/covariant-return-type-abyssal

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

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

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

【讨论】:

  • 很好的答案!谢谢
【解决方案2】:

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

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 和强制转换在被覆盖的方法中返回更具体的子类的一般情况可以正常工作(假设超类方法返回的确实是更具体的子类的实例)。

【讨论】:

  • 我像你一样做了一个更完整的例子,它很有效。现在我确定这不是 Java 问题,可能是 ATG 组件(Oracle Commerce)的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多