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)问题的伟大答案!谢谢