我尝试覆盖某种方法,让它具有更具体的回报。所以我做到了。
@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,当我尝试覆盖一些返回组件(和组件)的方法并将其转换为更具体的类时,就会出现问题。
答案 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可以正确地返回一个覆盖方法中更具体的子类的一般情况(假设超类方法返回的内容确实是更具体的子类的实例)。