如何为动态类型与声明类型不同的 class 字段编写 getter?
How can I write a getter for a class field whose dynamic type is different from declared type?
我在工作中遇到了如下情况,正在寻求更好的解决方案。有一个 BaseClass
,它的一个字段被声明为 FieldBaseClass
类型。该字段在子 classes 中实例化,然后具有动态类型 FieldChildClass
。我想为 return 是子 class (FieldChildClass
) 而不是父实例的字段写一个 getter。如何在不进行类型转换的情况下实现它?
我试过将 getter 放入子 class 并将 return 类型转换为特定的子 class,但这看起来很难看。
BaseClass.java
public class BaseClass {
protected FieldBaseClass field;
public BaseClass() {
field = calculateFieldValue();
}
public static class FieldBaseClass {
protected String bar = "bar";
}
}
ChildClass.java
public class ChildClass extends BaseClass {
public FieldChildClass calculateFieldValue() {
return new FieldChildClass("foo");
}
public static class FieldChildClass extends FieldBaseClass {
private String foo;
public FieldChildClass(String foo) {
this.foo = foo;
}
}
public FieldChildClass getField() {
return (FieldChildClass) field;
}
}
我认为这不可能。基本上,当该字段已声明类型时,您所能做的就是尝试将其隐藏,例如 here。但我不确定这是否适合您的需求。
我认为如果不进行类型转换,您将无法做到这一点。
您可以使用 generic type 例如T
定义字段的类型。
public class BaseClass<T extends FieldBaseClass> {
protected T field;
public T getField() {
return field;
}
}
public class ChildClass extends BaseClass<FieldChildClass> {
}
这将使您能够:
ChildClass c = new ChildClass();
FieldChildClass f = c.getField();
我在工作中遇到了如下情况,正在寻求更好的解决方案。有一个 BaseClass
,它的一个字段被声明为 FieldBaseClass
类型。该字段在子 classes 中实例化,然后具有动态类型 FieldChildClass
。我想为 return 是子 class (FieldChildClass
) 而不是父实例的字段写一个 getter。如何在不进行类型转换的情况下实现它?
我试过将 getter 放入子 class 并将 return 类型转换为特定的子 class,但这看起来很难看。
BaseClass.java
public class BaseClass {
protected FieldBaseClass field;
public BaseClass() {
field = calculateFieldValue();
}
public static class FieldBaseClass {
protected String bar = "bar";
}
}
ChildClass.java
public class ChildClass extends BaseClass {
public FieldChildClass calculateFieldValue() {
return new FieldChildClass("foo");
}
public static class FieldChildClass extends FieldBaseClass {
private String foo;
public FieldChildClass(String foo) {
this.foo = foo;
}
}
public FieldChildClass getField() {
return (FieldChildClass) field;
}
}
我认为这不可能。基本上,当该字段已声明类型时,您所能做的就是尝试将其隐藏,例如 here。但我不确定这是否适合您的需求。
我认为如果不进行类型转换,您将无法做到这一点。
您可以使用 generic type 例如T
定义字段的类型。
public class BaseClass<T extends FieldBaseClass> {
protected T field;
public T getField() {
return field;
}
}
public class ChildClass extends BaseClass<FieldChildClass> {
}
这将使您能够:
ChildClass c = new ChildClass();
FieldChildClass f = c.getField();