Javac терпит неудачу с «попыткой назначить более слабые привилегии доступа» на типе пересечения - PullRequest
0 голосов
/ 28 февраля 2019

Рассмотрим эту Java-программу:

public class IntersectionBug {

    public static interface FooInterface {
        public void foo();
    }

    public static class FooSupport {
        protected void foo() {
        }
    }

    public static class Whatever<T extends FooSupport & FooInterface> {
    }
}

Не удается скомпилировать в компиляторе JDK 1.8:

$ javac IntersectionBug.java
IntersectionBug.java:12: error: foo() in FooSupport cannot implement foo() in FooInterface
    public static class Whatever<T extends FooSupport & FooInterface> {
                                 ^
  attempting to assign weaker access privileges; was public
1 error

Очевидно, если некоторый тип T является одновременно FooSupport иFooInterface, тогда он должен иметь public void foo(), поэтому ошибка ложная.

Мой вопрос: это ошибка компилятора или JLS действительно указывает, что эта программа недействительна?Если последний случай, почему субоптимальное поведение JLS здесь?

1 Ответ

0 голосов
/ 02 марта 2019

JLS §4.9 определяет типы пересечений и их членов с помощью понятия условного класса .В вашем конкретном случае условный класс:

class <notional> extends FooSupport implements FooInterface {}

Обратите внимание на пустое тело класса.

Под абзацем JLS подразумевается, что условный класс должен быть правильно сформирован илипроисходит ошибка компиляции.Ясно, что класс, который наследует защищенную реализацию для метода открытого интерфейса, сформирован неправильно.

Я согласен с тем, что может быть другими способами указания типа пересечения, который допускал бы неизвестные подклассыFooSupport, который разрешит вышеуказанный конфликт, переопределив метод с общедоступной видимостью.

Я считаю, что стиль определения через условный класс был выбран, чтобы держать сложность в страхе.Посмотрите, как краткое §4.9 по сравнению с другими определениями.

PS: ecj также отклоняет ваш пример, говоря:

Унаследованный метод IntersectionBug.FooSupport.foo () не может скрытьоткрытый абстрактный метод в IntersectionBug.FooInterface

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...