2013-03-22 91 views
1

我有以下幾點:混亂與Java泛型和子類

  • 一個抽象類BaseScore
  • LevelScore這是BaseScore

一個子類,然後我有:

  • 抽象類BaseScoreRecord

    public abstract class BaseScoreRecord<T extends BaseScore> { 
        public BaseScoreRecord(){ 
         init(); 
        } 
    
        protected T[] mScoreHistory; 
        protected int count=0; 
        protected float finalScore; 
    
        protected abstract void calcFinalScore(); 
        protected abstract void init(); 
    
        public float getFinalScore() { 
         return mFinalScore; 
        } 
    
        public void addScoreRecord(T score){ 
         mScoreHistory[count] = score; 
         count++; 
        } 
    } 
    
  • ...和MyScoreRecord這是BaseScoreRecord

    public class MyScoreRecord extends BaseScoreRecord<LevelScore> { 
        public MyScoreRecord(){ 
         init(); 
        } 
    
        @Override 
        protected void calcFinalScore(){ 
         //Does some stuff to calc final score from mScoreHistory 
        } 
    
        @Override 
        protected void init(){ 
         mScoreHistory = new LevelScore[10]; 
         for (int i=0;i<mScoreHistory.length;i++){ 
          mScoreHistory[i] = new LevelScore(); 
         } 
        }; 
    } 
    

子類,所以,那我也BaseGame其中有如下一行:

protected BaseScoreRecord<? extends BaseScore> endGameRecord; 

.. 。和MyGame,它是BaseGame的子類。 MyGame包括以下方法:

@Override 
protected void gameInit(){ 
    endGameRecord = new MyScoreRecord(); //endGameRecord initialised 
} 


protected void addLevelScore(LevelScore ls){ 
    mEndGameRecord.addScoreRecord(ls); 
} 

我拿到這最後的方法編譯器錯誤:

The method addScoreRecord(capture#3-of ? extends BaseScore) 
in the type BaseScoreRecord <capture#3-of ? extends BaseScore> 
is not applicable for the arguments (LevelScore) 

...所以我evidentially做關於仿製藥,通配符和子類不對勁。如果我在BaseGameMyGame中丟失了泛型,它似乎都運行時沒有任何討厭的ClassCastException錯誤。任何指針將不勝感激。也許我讓自己變得太複雜了?

+1

「addLevelScore」方法中的mEndGameRecord是什麼?你的'EndGameScore'類型在哪裏? – 2013-03-22 04:56:18

+0

@Rohit對不起。發現得好。這就是它所說的 - 我通過我的文章中途決定更改班級名稱。已編輯帖子。 – Jon 2013-03-22 05:01:01

回答

1

你應該聲明MyScoreRecord實際上是BaseScoreRecord一個子類,並正確參數吧:

public class MyScoreRecord extends BaseScoreRecord<LevelScore> 

如果您使用的是Eclipse,例如,你會得到警告,因爲@Override註釋是不實際覆蓋任何東西。以上還將使編譯器強制執行LevelScore擴展BaseScore

+0

謝謝!同上....同樣我也檢查過了。已編輯帖子,以反映我的意思,並以某種方式省略 - 我的問題仍然存在。 – Jon 2013-03-22 05:02:39

+0

'mEndGameRecord'需要成爲「MyScoreRecord」才能使您的陳述生效。 – 2013-03-22 05:08:47