[英]Confusion with Java generics and subclassing
我有以下内容:
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)
...因此我显然在泛型,通配符和子类化方面做错了。 如果我在BaseGame
和MyGame
丢失了泛型,一切似乎都没有任何讨厌的ClassCastException错误。 任何指针将不胜感激。 也许我使事情变得太复杂了?
你应该声明MyScoreRecord
实际上是一个子类BaseScoreRecord
,并正确参数吧:
public class MyScoreRecord extends BaseScoreRecord<LevelScore>
例如,如果您使用的是Eclipse,则会收到警告,因为@Override
注释实际上并未覆盖任何内容。 上述还会使编译器强制执行LevelScore
延伸BaseScore
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.