【问题标题】:Confusion with Java generics and subclassing与 Java 泛型和子类混淆
【发布时间】:2013-03-22 04:45:33
【问题描述】:

我有以下几点:

  • 一个抽象类BaseScore
  • LevelScoreBaseScore 的子类

然后我有:

  • 一个抽象类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++;
         }
    }
    
  • ...和MyScoreRecordBaseScoreRecord 的子类

    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 错误。任何指针将不胜感激。也许我把事情搞得太复杂了?

【问题讨论】:

  • 你的addLevelScore 方法中的mEndGameRecord 是什么?你的EndGameScore 类型在哪里?
  • @Rohit 抱歉。好眼力。这就是它所说的——我在帖子中途决定更改班级名称。已编辑帖子。

标签: java generics wildcard subclassing


【解决方案1】:

你应该声明MyScoreRecord实际上是BaseScoreRecord的子类,并正确地参数化它:

public class MyScoreRecord extends BaseScoreRecord<LevelScore>

例如,如果您使用 Eclipse,您将收到警告,因为 @Override 注释实际上并未覆盖任何内容。以上也将使编译器强制LevelScore 扩展BaseScore

【讨论】:

  • 谢谢!同上....我也检查过了。已编辑帖子以反映我要输入的内容并以某种方式省略 - 我的查询仍然有效。
  • mEndGameRecord 必须是 MyScoreRecord 才能使您的声明生效。
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2015-07-11
  • 2015-05-13
  • 2011-04-25
  • 2011-11-04
相关资源
最近更新 更多