我正在尝试重写某些方法以使其具有更具体的收益。所以我做了。

@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,当我尝试重写一些返回组件(仅组件)并将其强制转换为更特定类的方法时,就会发生此问题。

最佳答案

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

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

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

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

09-27 02:51