gpt4 book ai didi

java - 为什么子类的属性返回 null

转载 作者:行者123 更新时间:2023-12-02 13:15:34 25 4
gpt4 key购买 nike

我对 Java 还比较陌生。我有一个问题我不太明白。

我有一个抽象类(父类(super class)),具有属性、类型。

public abstract class Variable implements ICompilerObject {

public String id;
public Type type;

public Type getType() {
return type;
}

public Variable(String name, Type t){
this.id = name;
type = t;
}

}

然后我有一些类型的子类:

public class NumberVariable extends Variable {

public int value;

public NumberVariable(String name){
super(name, new NumberType());
}

}

我想使用 type 属性来获取对象的实例(这里是 NumberType()。它是 Type 的子类。)但是当我打印这个时:

Variable var = someFunctionThatGetsAVariableFromList(); 
// var is now a NumberVariable with type == new NumberType();
System.out.println(var.type); //Prints null
System.out.println(var.type.getClass());
//Prints class compilerObjects.types.NumberType

我试图弄清楚为什么 var.type 不返回 NumberType 对象。我试图解决的问题是:我需要进行一些类型检查,其中需要比较 2 个对象,看看它们是否具有相同的类型(即相同的 Type 对象而不是 Java 类型)。上述方法背后的想法是,我可以从对象的属性中获取 Type 对象,然后比较它们。我还尝试创建一个方法(在变量子类上实现):

@Override
public Type getType() {
return new NumberType();
}

但是这也会打印 null。

编辑:同时拥有 type 属性和 getType() 方法似乎有些困惑。原因如下:他们不应该同时出现。它们并不意味着相关。这是我尝试过的两种方法,但都返回 null。问题不在于哪种方法更好,而在于是什么导致了上述行为。

我已经更新了代码以反射(reflect)托马斯的回答

最佳答案

在你的父类(super class)中你有这个:

public Type type;
public abstract Type getType();

这意味着 getType() 是一个抽象方法,没有任何实现,并且与 type 完全没有关系(除了名称上的相似之处) )。

然后在您的子类中实现该抽象方法并在每次调用时返回相应类型的新实例:

public Type getType() {
return new NumberType();
}

同样,与 type 没有关系,因此 var.type 仍将为 null。

由于您已经将类型传递给构造函数,因此您可能希望在父类(super class)中的 getType() 实现中创建:

public Type getType() {
return type;
}

并删除子类中的重写实现。

另请注意,即使 type 不为 null,System.out.println(var.type); 仍可能打印 null。这是因为 toString() 是在 type 上调用的,如果您重写该方法以返回 null,您将得到 null。

执行此操作的一个指标是 System.out.println(var.type.getClass()); 不会抛出 NullPointerException

关于java - 为什么子类的属性返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43778115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com