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的任何类”的要求。(强调矿山)