【问题标题】:Java8 IntStream incompatible return type for Collections<Integer>.stream()Collections<Integer>.stream() 的 Java8 IntStream 返回类型不兼容
【发布时间】:2015-05-25 20:22:18
【问题描述】:

我对此有点迷茫。我有一个代码(不是我写的),它有一个名为 BitSetExt 的类,它扩展了 BitSet。签名看起来像:

private class BitSetExt extends BitSet implements Set<Integer>

stream() 方法在扩展类中未被覆盖。我知道代码在 Java 1.6 上编译得很好。在带有 Java8 的 Eclipse 中,出现错误:

返回类型与继承的方法 Collection.stream()、BitSet.stream() 不兼容。

如果我尝试覆盖 stream() 并将 IntStream 返回类型更改为任何内容,我会收到一个不同的错误,并建议将返回类型更改为 IntStream(这显然不兼容)。那么,我不明白什么以及如何修复此代码?

感谢您的帮助。

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    从 Java 8 开始,BitSet 有一个方法声明为

    IntStream stream()
    

    Set&lt;Integer&gt; 有一个同名的方法,声明为

    Stream<Integer> stream()
    

    由于这些方法名称相同但返回类型不兼容,因此不可能同时扩展 BitSet 和实现 Set。

    您必须重构该类,使其不再实现Set&lt;Integer&gt;,例如,添加一个在对象上返回视图的方法,实现Set&lt;Integer&gt;

    public Set<Integer> asSet();
    

    【讨论】:

    • 或者——可能是一个更好的主意——让你的实现有一个BitSet并实现Set,这可能是一个更强大的接口。
    【解决方案2】:

    该类永远不会在 Java 8 中编译。

    Set&lt;Integer&gt; 要求你实现一个带有签名的方法

    public Stream<Integer> stream();
    

    BitSet 提供了一个带有签名的实现

    public IntStream stream();
    

    并且IntStream 不是Stream&lt;integer&gt; 的子类型。没有一种类型可以同时满足这两个要求。

    【讨论】:

    • 作为一个小补充,虽然Stream&lt;Integer&gt;IntStream 都是接口,但由于类似的原因,不可能有一个类型同时实现这两者——冲突的方法,例如toArray,让这成为不可能。好吧,他们有一个冲突的超级接口声明。因此,不仅不可能实现stream() 方法返回满足两个接口的类型,甚至声明这样的方法也是不可能的。
    猜你喜欢
    • 2019-08-25
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2014-08-29
    • 2016-05-28
    相关资源
    最近更新 更多