這裏是我的情況通用<T extends A>類使用一個靜態字段,而不是T的一個
public abstract class Actions {
public static Actions STAND;
public static Actions ATTACK;
public static Actions COLONIZE;
public static Actions DEFEND;
public static Actions TURN_CW;
public static Actions TURN_CCW;
public static Actions DIE;
public abstract long[] getFramesDurations();
public abstract int[] getBaseTiles();
}
public class SimpleActions extends Actions{
public static Actions STAND = new SimpleActions(new long[]{120,120,120,120,120,120,120}, new int[]{0,1,2,3,4,5,6});
public static Actions ATTACK = new SimpleActions(new long[]{120,120,120,120,120,120,120,120,120}, new int[]{7,8,9,10,11,12,13,14,15});
public static Actions COLONIZE = new SimpleActions(new long[]{120,120,120,120,120,120,120}, new int[]{7,8,9,10,11,12,13,14,15});
public static Actions DEFEND = new SimpleActions(new long[]{1}, new int[]{1});
public static Actions TURN_CW = new SimpleActions(new long[]{1}, new int[]{1});
public static Actions TURN_CCW = new SimpleActions(new long[]{1}, new int[]{1});
public static Actions DIE = new SimpleActions(new long[]{1}, new int[]{1});
private final long[] mActionFramesDurations;
private final int[] mActionBaseTiles;
SimpleActions(long[] pActionFramesDurations, int[] pActionBaseTiles) {
mActionFramesDurations = pActionFramesDurations;
mActionBaseTiles = pActionBaseTiles;
}
public long[] getFramesDurations()
{
return mActionFramesDurations;
}
public int[] getBaseTiles()
{
return mActionBaseTiles;
}
}
public abstract class A<T extends Actions> {
A() {
doSomething(T.STAND);
}
protected void doSomething(Actions action) { use action somewhere}
}
public class B extends A<SimpleActions> {
B() {
super();
}
}
我總是得到NullPointerException異常時,A的構造函數調用DoSomething的,因爲行動是空..
由於B延伸的我期待它使用SimpleActions.STAND,而不是Actions.STAND。
我在做什麼錯了?我應該怎麼做?
您正在從類「B」調用'super()' - 在超類層次,所有編譯器都知道'T'擴展了'Actions',而不是'SimpleActions'。你有沒有考慮過爲你的行爲使用'Enum',還是需要「覆蓋」它們?如果有的話,Java不會像你期望的那樣通過Smalltalk進行靜態繼承;因爲你的代碼是,你的'Actions'類中的靜態聲明是毫無意義的。 –