我一直在测试 Java 中的泛型编程。
这是我的代码片段:
public class Vehicle<T extends Style> {
private T make;
private String color;
private int year;
private String brand;
private String model;
public Vehicle() {
this.brand = make.getMake();
}
public Vehicle(String c, int yr, String mod) {
this.brand = make.getMake();
this.color = c;
this.year = yr;
this.model = mod;
}
public void printInfo() {
System.out.println(this.year + " " + this.color + " " + this.brand + " " + this.model);
}
public void setColor(String c) {
this.color = c;
}
public void setYear(int yr) {
this.year = yr;
}
public void setModel(String mod) {
this.model = mod;
}
}
这是在类型参数中扩展的接口Style
:
public interface Style {
public String getMake();
public boolean usesGas();
public boolean usesElectricity();
}
此接口由另一个名为 的类实现Ford
,其中getMake()
方法的实现如下:
private String make = "FORD";
public String getMake() {
return make;
}
在我的驱动程序类Test
中,我正在测试所有这些东西,如下所示:
public class Test{
public static void main(String[] args){
Vehicle<Ford> fordFusion = new Vehicle<Ford>();
fordFusion.setColor("GRAY");
fordFusion.setModel("FUSION");
fordFusion.setYear(2015);
fordFusion.printInfo();
}
}
现在,在我的理解中,应该能够通过使用接口来访问通用对象的字段变量和方法,在本例中就是我的Style
接口。并且编译器在 IDE 中对此没有任何问题。该程序应该正在访问该getMake()
方法并打印出:
2015 GRAY FORD FUSION
但是,控制台显示:
Exception in thread "main" java.lang.NullPointerException
at Vehicle.<init>(Vehicle.java:32)
at Test.main(Driver.java:16)
它指向我拥有的那条线this.brand = make.getMake();
那么这里到底发生了什么?我究竟做错了什么?
编辑:这个被标记为重复的问题并没有解决我的特殊情况。虽然这里的错误是 a NullPointerException
,但它与那个旧问题有很大不同。
这是一个与我的问题相同的问题。如果该问题的解决方案是有效的,那么我应该能够完成我一直在尝试做的事情。