我一直在测试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();
那么世界上到底发生了什么?我做错了什么?
编辑:这个被标记为重复的问题并不能解决我的具体情况。虽然这里的错误是NullPointerException
,但它与旧问题有很大不同。
Here is a question解决与我相同的问题。如果该问题的解决方案有效,那么我应该能够完成我一直想做的事情。