Публично объявить закрытый тип пакета в сигнатуре метода

Это возможно в Java:

package x;

public class X {

    // How can this method be public??
    public Y getY() {
        return new Y();
    }
}

class Y {}

Итак, по какой хорошей причине компилятор Java позволяет мне объявить метод getY () как общедоступный ? Что меня беспокоит: класс Y является закрытым пакетом, но метод доступа getY () объявляет его в своей сигнатуре метода. Но вне пакета x я могу присвоить результаты метода только Object :

// OK
Object o = new X().getY();

// Not OK:
Y y = new X().getY();

OK. Теперь я могу как-то попытаться составить пример, где это можно было бы как-то объяснить с помощью ковариации результатов метода . Но что еще хуже, я также могу сделать это:

package x;

public class X {
    public Y getY(Y result) {
        return result;
    }
}

class Y {}

Теперь я никогда не мог вызвать getY (Y result) извне пакета x . Почему я могу это сделать? Почему компилятор позволяет мне объявить метод таким образом, чтобы я не мог его вызвать?

9
задан Lukas Eder 10 March 2011 в 21:04
поделиться