Сегодня, работая над проектом для курса «Паттерны проектирования» в колледже (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
Почему «VAR» в Java 11 обходит «защищенное» ограничение доступа? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение