0

我担心我用错了这个问题的措辞,所以这里有一个例子来说明:

我有一个界面:

public interface ICard  extends Comparable<T>{

    public abstract String toString();

    public abstract int compareTo(T o) throws WrongCardTypeException;

}

我想要的是实现 ICard 的类自动实现Comparable<T>,以便您只能比较实现 ICard 的任何类

相反,我需要为可比较的扩展指定泛型并使用下面的那种instancof检查

public interface ICard  extends Comparable<ICard>{

    public abstract String toString();

    public abstract int compareTo(ICard o) throws WrongCardTypeException;

}

public class PlayingCard implements ICard{
    public enum Rank { TWO, THREE, FOUR, FIVE, SIX,
        SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }

    public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }

    private  Rank rank;
    private  Suit suit;

    public PlayingCard(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public Rank getRank() { return rank; }

    public Suit getSuit() { return suit; }


    @Override
    public String toString() { return rank + " of " + suit; }

    @Override
    public int compareTo(ICard o) throws WrongCardTypeException {
        if (o instanceof PlayingCard){
        PlayingCard c = (PlayingCard)o;
        int rankCompare = rank.compareTo(c.rank);
        return rankCompare != 0 ? rankCompare : suit.compareTo(c.suit);
        }
    throw new WrongCardTypeException("Tried to compare "+o.getClass().getCanonicalName()+" to "+ this.getClass().getCanonicalName());
    }

我想知道是否有一种更简洁的方法可以让我取消instanceof支票?通配符?我不确定这里。还是instanceof支票没问题?我听说它有“代码气味”,例如是不好的做法。


我的 IDeck 界面也有类似的 (?) 问题:

public interface IDeck<T extends ICard> extends Comparable<T>, Collection<T>{
    public ArrayList<T> getDeck();
    public void setDeck(Set<T> newDeck);
}

在实现这一点的类中,我的compareTo方法采用 type 的参数ICard,但我想比较从 IDeck 继承的牌组。

4

3 回答 3

3

您可以使您的ICard接口泛型,有界,所以它任何泛型类型参数本身必须是一个ICard.

public interface ICard<T extends ICard<T>>  extends Comparable<T>{

然后可以在类PlayingCard中的ICard接口中指定PlayingCard

public class PlayingCard implements ICard<PlayingCard> {
于 2013-06-17T22:12:14.377 回答
2

我想你想要

public interface ICard<T> extends Comparable<T>{

  public abstract String toString();

  public abstract int compareTo(T o) throws WrongCardTypeException;

}

(注意ICard<T>

然后PlayingCard implements ICard<PlayingCard>

也就是说,这个接口完全没有给你带来任何东西Comparable,因为toString()它已经可用于所有 Java 对象,并且尝试要求它不会有任何效果。

于 2013-06-17T22:11:01.857 回答
1

您需要“重新指定”T,尝试:

public interface ICard<T> extends Comparable<T>
于 2013-06-17T22:11:52.257 回答