gpt4 book ai didi

java - 从接口(interface)继承扩展泛型类型

转载 作者:行者123 更新时间:2023-12-01 08:11:13 29 4
gpt4 key购买 nike

我担心我错误地表达了这个问题,所以这里有一个例子来说明:

我有一个界面:

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方法采用 ICard 类型的参数,尽管我想比较从 IDeck 继承的套牌。

最佳答案

您可以使您的 ICard 接口(interface)通用,并带有绑定(bind),因此任何通用类型参数本身都必须是 ICard

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

然后就可以在PlayingCard类的ICard接口(interface)中指定PlayingCard:

public class PlayingCard implements ICard<PlayingCard> {

关于java - 从接口(interface)继承扩展泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157702/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com