具有方法参数超类的接口实现

卡尔:

作为该主题中一般问题的一个实际示例,我想containsAllSet

public boolean containsAll(Iterable<?> c) { /* ... */ }

我想这应该是允许的,因为CollectionIterable意味着这种containsAll将涵盖接口要求。同样,更普遍的是能够使用参数超类实现接口似乎应该起作用。

但是,Eclipse却说没有办法(没有尝试过Javac直升法)-有人可以解释原因吗?我确定规范中有某些内容可以使它保持现状,但是我也想了解需求的动机。还是我缺少像Iterable<?>不是超类的东西Collection<?>

附带的问题-给定我要声明的两个方法Iterable,带有Collection参数的方法是否总是在带有参数的调用中优先使用

Eclipse错误:

如果我删除带有Collection签名的方法,只留下Iterable一个(请参阅后面的错误),则会得到以下信息:

The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)

确切的实现是:

@Override public boolean containsAll(Collection<?> c) {
  for (Object o : c) if (!contains(o)) return false;
  return true;
}
public boolean containsAll(Iterable<?> c) {
  for (Object o : c) if (!contains(o)) return false;
  return true;
}
催产素:

我对为什么Java有此限制的猜测是,您有:

class A {
    void foo(String s) { ...  }
}

class B extends A {
    // Note generalized type
    @Override void foo(Object s) { ...  }
}

现在,如果您有class C extends B并且要覆盖foo,则不清楚应该采用什么参数。

例如,首先说C扩展了A,直接覆盖A void foo(String s),然后更改为扩展B。在这种情况下,C的现有覆盖foo无效将变为无效,因为B foo应当能够处理所有Objects,而不仅仅是Strings。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章