繁体   English   中英

与Java泛型和子类的混淆

[英]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)

...因此我显然在泛型,通配符和子类化方面做错了。 如果我在BaseGameMyGame丢失了泛型,一切似乎都没有任何讨厌的ClassCastException错误。 任何指针将不胜感激。 也许我使事情变得太复杂了?

你应该声明MyScoreRecord实际上是一个子类BaseScoreRecord ,并正确参数吧:

public class MyScoreRecord extends BaseScoreRecord<LevelScore>

例如,如果您使用的是Eclipse,则会收到警告,因为@Override注释实际上并未覆盖任何内容。 上述还会使编译器强制执行LevelScore延伸BaseScore

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM