Java 从接口继承扩展泛型类型

Java 从接口继承扩展泛型类型,java,generics,inheritance,Java,Generics,Inheritance,我担心这个问题的措辞有误,所以这里有一个例子来说明: 我有一个界面: public interface ICard extends Comparable<T>{ public abstract String toString(); public abstract int compareTo(T o) throws WrongCardTypeException; } 我想知道是否有一种更简洁的方法来做这件事,可以让我去掉instanceof检查?通配符?我不确

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

我有一个界面:

public interface ICard  extends Comparable<T>{

    public abstract String toString();

    public abstract int compareTo(T o) throws WrongCardTypeException;

}
我想知道是否有一种更简洁的方法来做这件事,可以让我去掉
instanceof
检查?通配符?我不确定。或者检查的
实例是否正常?我听说它有“代码气味”,例如,这是一种糟糕的做法


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

public interface IDeck<T extends ICard> extends Comparable<T>, Collection<T>{
    public ArrayList<T> getDeck();
    public void setDeck(Set<T> newDeck);
}
公共接口IDeck扩展了可比较的集合{
公共ArrayList getDeck();
公共空间集合甲板(集合新甲板);
}
在实现此功能的类中,我的
compareTo
方法采用
ICard
类型的参数,尽管我想比较从IDeck继承的数据组。

我想您需要

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

  public abstract String toString();

  public abstract int compareTo(T o) throws WrongCardTypeException;

}
公共接口ICard扩展{
公共抽象字符串toString();
公共摘要int compareTo(to)抛出错误的CardTypeException;
}
(注意
ICard

然后,
PlayingCard实现ICard

public interface ICard<T extends ICard<T>>  extends Comparable<T>{
也就是说,这个接口在
Compariable
接口上没有什么好处,因为
toString()
已经可用于所有Java对象,尝试使用它将没有任何效果。

我想您需要它

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

  public abstract String toString();

  public abstract int compareTo(T o) throws WrongCardTypeException;

}
公共接口ICard扩展{
公共抽象字符串toString();
公共摘要int compareTo(to)抛出错误的CardTypeException;
}
(注意
ICard

然后,
PlayingCard实现ICard

public interface ICard<T extends ICard<T>>  extends Comparable<T>{
这就是说,这个接口在
Compariable
接口上没有任何效果,因为
toString()
已经可用于所有Java对象,尝试要求它将没有任何效果。

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

public interface ICard<T> extends Comparable<T>
公共接口ICard扩展
您需要“重新指定”T,请尝试:

public interface ICard<T> extends Comparable<T>
公共接口ICard扩展

您可以使您的
ICard
接口具有绑定,因此任何泛型类型参数本身都必须是
ICard

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

您可以使用绑定将
ICard
接口设置为泛型,因此任何泛型类型参数本身都必须是
ICard

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

你能告诉我为什么我要ICard吗?我想我会使用通配符,但我只见过用于收集的泛型,而卡片不是卡片的集合这一事实让我很反感。更进一步,我如何将其扩展到只能包含某种卡的卡组接口?您指出,实现ICard的任何类都只能比较“实现ICard的任何类”,因此绑定。泛型用于当一个类与另一个类具有特定但未知的关系时。在集合中,这种关系是“包含”,但在您的例子中是“可比”。一个
Deck
类听起来像是一组卡片,所以像collections类一样,您可能需要类似于
public interface Deck
的东西。谢谢。我已经为我的
IDeck
尝试了该接口规范,但是当我扩展Comparable时,我得到了这个方法大纲:
public int compareTo(PlayingCard o)
当我想要
public int compareTo(PlayingCard o)
。不过,我想这值得再问一个问题。
T extensed ICard
从类型安全的角度来看是完全没有意义的。@newacct您能解释一下为什么它没有意义吗?关键是它满足了“我想要的是实现ICard的类自动实现Comparable,以便您只能比较实现ICard的任何类”的要求。(强调我的)你能告诉我为什么我想要ICard吗?我想我会使用通配符,但我只见过用于收集的泛型,而卡片不是卡片的集合这一事实让我很反感。更进一步,我如何将其扩展到只能包含某种卡的卡组接口?您指出,实现ICard的任何类都只能比较“实现ICard的任何类”,因此绑定。泛型用于当一个类与另一个类具有特定但未知的关系时。在集合中,这种关系是“包含”,但在您的例子中是“可比”。一个
Deck
类听起来像是一组卡片,所以像collections类一样,您可能需要类似于
public interface Deck
的东西。谢谢。我已经为我的
IDeck
尝试了该接口规范,但是当我扩展Comparable时,我得到了这个方法大纲:
public int compareTo(PlayingCard o)
当我想要
public int compareTo(PlayingCard o)
。不过,我想这值得再问一个问题。
T extensed ICard
从类型安全的角度来看是完全没有意义的。@newacct您能解释一下为什么它没有意义吗?关键是它满足了“我想要的是实现ICard的类自动实现Comparable,以便您只能比较实现ICard的任何类”的要求。(强调矿山)