1

私は次のものを持っています:

  • 抽象クラス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これはのサブクラスですBaseGameMyGame次のメソッドが含まれます。

@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)

...だから私は明らかにジェネリック、ワイルドカード、サブクラス化に関して何か間違ったことをしている。ジェネリックスを失い、BaseGameすべてMyGameが厄介なClassCastExceptionエラーなしで実行されているように見える場合。任意のポインタをいただければ幸いです。多分私は自分自身のために物事を複雑にしすぎたのでしょうか?

4

1 に答える 1

1

MyScoreRecordが実際には のサブクラスであることを宣言しBaseScoreRecord、適切にパラメータ化する必要があります。

public class MyScoreRecord extends BaseScoreRecord<LevelScore>

たとえば、Eclipse を使用している場合、@Override注釈は実際には何もオーバーライドしていないため、警告が表示されます。上記はまた、コンパイラにLevelScoreextendsを強制させますBaseScore

于 2013-03-22T04:56:38.597 に答える