ATG - 覆盖方法和 return 更具体的组件
ATG - Override method and return more specific component
我正在尝试重写某些方法以使其更具体 return。所以我做到了。
@Override
public StoreProfile getProfile() {
return (StoreProfile)super.getProfile();
}
但是,方法 super.getProfile()
在被覆盖时总是 return 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,当我尝试重写 return 一个 component (并且只是组件)的某些方法并将其转换为更具体的 class.
看来你做错了什么。考虑这个例子:
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
更具体的getNumber()
方法class一个returns一个Integer
,否则赋值
integer=a.getNumber();
不行。输出为“1”,不为空。因此,通过调用 super 和转换在覆盖方法中返回更具体的 subclass 的一般情况正常工作(假设 superclass 方法 returns 确实是 more 的一个实例具体子class).
您看到的是协变 Return 问题的示例,此处解释得很好:https://dzone.com/articles/covariant-return-type-abyssal
您看到的普通 Java 的不同之处在于 ATG 使用的是 JavaBeans。如果 JavaBeans 首先加载基础 class,它会同时看到 get 和 set 方法。如果 JavaBeans 首先加载 subclass,它会看到 getter 但没有相应的 setter(它在类型上不匹配,并且不在规范中检查基础classes)。由于这种依赖性,服务器启动中的微小变化可能会导致空值,您应该始终避免这个问题。
最好的解决办法是让你的子class的getter有一个不同的名字。根据您的示例,我将使用:
public StoreProfile getStoreProfile() {
return (StoreProfile) getProfile();
}
我正在尝试重写某些方法以使其更具体 return。所以我做到了。
@Override
public StoreProfile getProfile() {
return (StoreProfile)super.getProfile();
}
但是,方法 super.getProfile()
在被覆盖时总是 return 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,当我尝试重写 return 一个 component (并且只是组件)的某些方法并将其转换为更具体的 class.
看来你做错了什么。考虑这个例子:
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
更具体的getNumber()
方法class一个returns一个Integer
,否则赋值
integer=a.getNumber();
不行。输出为“1”,不为空。因此,通过调用 super 和转换在覆盖方法中返回更具体的 subclass 的一般情况正常工作(假设 superclass 方法 returns 确实是 more 的一个实例具体子class).
您看到的是协变 Return 问题的示例,此处解释得很好:https://dzone.com/articles/covariant-return-type-abyssal
您看到的普通 Java 的不同之处在于 ATG 使用的是 JavaBeans。如果 JavaBeans 首先加载基础 class,它会同时看到 get 和 set 方法。如果 JavaBeans 首先加载 subclass,它会看到 getter 但没有相应的 setter(它在类型上不匹配,并且不在规范中检查基础classes)。由于这种依赖性,服务器启动中的微小变化可能会导致空值,您应该始终避免这个问题。
最好的解决办法是让你的子class的getter有一个不同的名字。根据您的示例,我将使用:
public StoreProfile getStoreProfile() {
return (StoreProfile) getProfile();
}