Почему «VAR» в Java 11 обходит «защищенное» ограничение доступа?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему «VAR» в Java 11 обходит «защищенное» ограничение доступа?

Сообщение Anonymous »

Сегодня, работая над проектом для курса «Паттерны проектирования» в колледже (Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которая может быть обошрена путем объявления VAR. Я знаю, как используется VAR, это просто синтаксический сахар, который оставляет тип вывод для компилятора. Разве это не было бы несоответствием типа? < /Li>
[*] "InnerParent"? Разве это не обходит защищенный ограничитель доступа?public abstract class Parent {
protected abstract static class InnerParent {
public InnerParent self() {
return this;
}
}
}
< /code>
public class Child extends Parent {
public static class InnerChild extends InnerParent {}
}
< /code>
import anotherpackage.Child;

/**
* Compiling with Java 11:
*/
public class Main {
public static void main(String[] args) {
// As we expected a compilation error: The returned static type does not match the expected type
// Child.InnerChild innerChild = new Child.InnerChild().self();

// As we expected a compilation error: Parent.InnerParent is package visible (protected)
// Parent.InnerParent innerChild = new Child.InnerChild().self();

// Why does it compile and run correctly here?
// var is just syntactic sugar for the compiler type, it should be a Parent.InnerParent alias here,
// why is var allowed to transgress the protected access restriction?
var innerChild = new Child.InnerChild().self();
System.out.println(innerChild);
System.out.println(innerChild.getClass().getName());
}
}

Я также спросил CHATGPT, но он не отвечает так, как мне нравится, и я не уверен, что это правильно:

Почему var работает

Parent.innerparent .
Правила доступа
: поскольку тип выведен и не написан в коде, компилятор не обеспечивает ограничения доступа к объявленной переменной. getClass () ?

Как можно скомпилировать этот путь. PrettyPrint-Override ">System.out.println(((Object) innerChild).getClass().getName());
// OUTPUT: com.github.lorenzoyang.anotherpackage.Child$InnerChild


Подробнее здесь: https://stackoverflow.com/questions/793 ... estriction
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему «var» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Почему «var» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Почему «var» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Почему «var» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Почему «var» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»