Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ATG-重写方法并返回更具体的组件_Java_Atg - Fatal编程技术网

Java ATG-重写方法并返回更具体的组件

Java ATG-重写方法并返回更具体的组件,java,atg,Java,Atg,我试图覆盖一些方法,让它有更具体的返回。所以我做了 @覆盖 publicstoreprofile 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) Dyna

我试图覆盖一些方法,让它有更具体的返回。所以我做了

@覆盖
publicstoreprofile 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的问题。
我的项目使用ATG10.0.3,当我尝试重写某个返回组件(仅返回组件)的方法并将其转换为更具体的类时,就会出现这个问题。

似乎您做错了什么。考虑这个例子:

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=a.getNumber();

这是行不通的。并且输出为“1”,而不是null。因此,通过调用super和casting在重写方法中返回更具体的子类的一般情况可以正常工作(假设超类方法返回的确实是更具体的子类的实例)。

您看到了协变返回问题的一个示例,在这里解释得很好:

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

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

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

你的问题是什么?如果不覆盖该方法,你会得到一个非null值吗?@StefanWarminski是的,如果我不覆盖该方法,返回值是非null的,它不会返回父类的任何方法
getProfile()
,因为调用了
super
?父级的
getProfile()
返回什么?您需要附加更多的代码,以便我们了解一些上下文。听起来你好像做错了什么事。我和你一样做了一个更完整的例子,效果很好。现在我确信这不是一个Java问题,也许是ATG组件(Oracle Commerce)问题的伟大答案!谢谢