Java8 IntStream несовместимый тип возврата для коллекций<Integer>.stream()

Я немного потерян с этим. У меня есть код (который я не писал), который имеет класс с именем BitSetExt, который расширяет BitSet. Подпись выглядит так:

private class BitSetExt extends BitSet implements Set<Integer>

Метод stream() не переопределяется в расширенном классе. Я знаю, что код прекрасно компилируется с Java 1.6. В Eclipse с Java8 я получаю ошибку:

Возвращаемые типы несовместимы для унаследованных методов Collection.stream(), BitSet.stream().

Если я пытаюсь переопределить stream() и изменить тип возвращаемого значения IntStream на что-либо, я получаю другую ошибку и предложение изменить тип возвращаемого значения на IntStream (что, по-видимому, несовместимо). Итак, что я не понимаю и как я могу исправить этот код?

Спасибо за любую помощь.

2 ответа

Решение

Начиная с Java 8, BitSet имеет метод, объявленный как

IntStream stream()

а также Set<Integer> имеет метод с тем же именем, объявленный как

Stream<Integer> stream()

Поскольку эти методы имеют одно и то же имя, но несовместимый тип возвращаемого значения, невозможно расширить BitSet и реализовать Set одновременно.

Вы должны будете реорганизовать класс так, чтобы он не реализовывал Set<Integer> и, например, добавить метод, который возвращает вид на объект, реализуя Set<Integer>:

public Set<Integer> asSet();

Этот класс никогда не скомпилируется в Java 8.

Set<Integer> требует, чтобы вы реализовали метод с подписью

public Stream<Integer> stream();

в то время как BitSet обеспечивает реализацию с подписью

public IntStream stream();

И IntStream не является подтипом Stream<integer>, Не существует типа, который бы удовлетворял обоим требованиям.

Другие вопросы по тегам