【问题标题】:Why does my java class implement methods I don't expect?为什么我的 java 类实现了我不期望的方法?
【发布时间】:2013-06-18 19:26:48
【问题描述】:

我有这个界面:

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

然后我让一个类实现它,这是标题和前几个方法:

public class PlayingCardDeck implements IDeck<PlayingCardDeck,PlayingCard> {

    @Override
    public int compareTo(PlayingCardDeck o) {
        // TODO Auto-generated method stub
        return 0;
    }

到目前为止还不错,我希望它具有可比性。

    @Override
    public boolean add(PlayingCard e) {
        // TODO Auto-generated method stub
        return false;
    }

是的,它可以包含扑克牌

    @Override
    public boolean addAll(Collection<? extends PlayingCard> c) {
        // TODO Auto-generated method stub
        return false;
    }

我认为这没问题,只要集合元素扩展 PlayingCard,尽管这与 add(PlayingCard e) 方法不匹配。

    @Override
    public boolean contains(Object o) {
        // TODO Auto-generated method stub
        return false;
    }

等一下?为什么这里的类型是Object 而不是PlayingCard

public Object[] toArray() {
    // TODO Auto-generated method stub
    return null;
}

所以任何数组都必须是对象,而不是扑克牌?

为什么我的接口实现了“奇怪”的功能,而不是我提供的泛型?我错过了什么?

【问题讨论】:

    标签: java generics inheritance interface


    【解决方案1】:

    因为Collection.contains(Object)Object 作为其参数。它没有定义为Collection.contains(E)。至于为什么会这样,你可以找到详细的解释here

    【讨论】:

    • 我一直想知道是否有任何人,只有一个人,实际上使用这种行为来做一件好事。因为显然有很多人觉得它很烦人。
    • @Slanec 我对那个答案和 cmets 的阅读越多,我就越认为这是为了向后兼容而存在的。
    • +1 并不是为了向后兼容。 containsremove 等采用 Object,因为 equals 采用 Object,并且他们的合约委托给 equals 合约。
    • 问题不仅在于他们委托给equals 合约,还在于询问Cat 的集合是否包含可能包含或不包含的内容本身并没有错Cat。如果问题不是Cat,该集合可以简单地回复“不,我不包含那个”。
    【解决方案2】:

    因为public Object[] toArray() 是在接口java.util.Collection 中声明的,并且不是通用的。以及contains(Object o)。它们在您实现的接口中以这种方式声明(非泛型)。

    【讨论】:

    • 我认为您实际上可以使用协变返回类型将其替换为 public PlayingCard[] to Array()
    • @TomHawtin-tackline 关心解释一下?
    • @Pureferret 您可以收紧已实现/覆盖方法的返回类型(来自 J2SE 5.0)。 PlayingCard[]Object[] 的子类型(专业化),尽管它不应该是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2011-02-25
    • 2014-07-30
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多