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

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

Сообщение Anonymous »

Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это всего лишь синтаксический сахар, который оставляет определение типа компилятору.
Я не могу понять, какой тип псевдонима на самом деле здесь используется var. :
  • это «Child.InnerChild»? Не будет ли это несоответствием типов?
  • "InnerParent"? Разве это не обходит ограничитель защищенного доступа?
Вот мой упрощенный код:

Код: Выделить всё

package com.github.lorenzoyang.anotherpackage;

public abstract class Parent {
protected abstract static class InnerParent {
public InnerParent self() {
return this;
}
}
}

package com.github.lorenzoyang.anotherpackage;

public class Child extends Parent{
public static class InnerChild extends InnerParent{

}
}

package com.github.lorenzoyang;

import com.github.lorenzoyang.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(); // perhce' non da' errore ? var e' un alias di cosa ?
System.out.println(innerChild);
System.out.println(innerChild.getClass().getName());
}
}
Я также спрашивал в чате, но он отвечает не так хорошо, как хотелось бы, и я не уверен, что это правильно:

Почему var работает
  • Выведенный тип: выведенный тип для varinnerChild: Parent.InnerParent.
  • Правила доступа: поскольку тип выводится, а не прописывается явно в коде, компилятор не применяет ограничения доступа. для объявленной переменной.
Обнаружена новая проблема: почему я не могу получить доступ к getClass()?
Изображение


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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему «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 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Почему «VAR» в Java 11 обходит «защищенное» ограничение доступа?
    Anonymous » » в форуме JAVA
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

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