public enum Outcome{WIN,LOSE,DRAW}//定义枚举常量
public interface Competitor<T extends Competitor<T>>{//定义一个Competitor接口,里面有个compete()方法
Outcome compete(T competitor);
}
public enum Roshambo4 implements Competitor<Roshambo4>{ ROCK{
public Outcome compete(Roshambo4 opponent){
return compete(SCISSORS,opponent);
}
},
SCISSORS{
public Outcome compete(Roshambo4 opponent){
return compete(PAPER,opponent);
}
},
PAPER{
public Outcome compete(Roshambo4 opponent){
return compete(ROCK,opponent);
}
};

public Outcome compete(Roshambo4 loser,Roshambo4 opponent){//这个方法应该不是实现Competitor接口中的方法,可是为什么编译能通过呢?
return ((opponent==this)?Outcome.DRAW:((opponent==loser)?Outcome.WIN:Outcome.LOSE));
}
}
这个题是thinkInJava中的,作者不推荐这种写法,可是为什么不报错呢?

解决方案 »

  1.   

    哦,我知道了,PAPER,SICSSORS,ROCK这些都是Roshambo4的“实例”,而他们都Override了compete(Competitor)方法,right ?
      

  2.   

    public Outcome compete(Roshambo4 loser,Roshambo4 opponent){//这个方法应该不是实现Competitor接口中的方法,可是为什么编译能通过呢?
            return ((opponent==this)?Outcome.DRAW:((opponent==loser)?Outcome.WIN:Outcome.LOSE));
    }PAPER,SICSSORS,ROCK return 时,调用的可都是这个方法呀你的理解应该是对的。