【发布时间】:2013-03-22 04:45:33
【问题描述】:
我有以下几点:
- 一个抽象类
BaseScore -
LevelScore是BaseScore的子类
然后我有:
-
一个抽象类
BaseScoreRecordpublic 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)
...所以我显然在泛型、通配符和子类化方面做错了。如果我丢失了BaseGame 和MyGame 中的泛型,它似乎运行起来没有任何讨厌的ClassCastException 错误。任何指针将不胜感激。也许我把事情搞得太复杂了?
【问题讨论】:
-
你的
addLevelScore方法中的mEndGameRecord是什么?你的EndGameScore类型在哪里? -
@Rohit 抱歉。好眼力。这就是它所说的——我在帖子中途决定更改班级名称。已编辑帖子。
标签: java generics wildcard subclassing