Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется 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()?
Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это всего лишь синтаксический сахар, который оставляет определение типа компилятору. [b]Я не могу понять, какой тип псевдонима на самом деле здесь используется var. :[/b] [list] [*]это «Child.InnerChild»? Не будет ли это несоответствием типов? [*]"InnerParent"? Разве это не обходит ограничитель защищенного доступа? [/list] [b]Вот мой упрощенный код:[/b] [code]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{
/** * 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()); } } [/code] [b]Я также спрашивал в чате, но он отвечает не так хорошо, как хотелось бы, и я не уверен, что это правильно:[/b]
Почему var работает [list] [*][b]Выведенный тип[/b]: выведенный тип для varinnerChild: Parent.InnerParent. [*][b]Правила доступа[/b]: поскольку тип выводится, а не прописывается явно в коде, компилятор не применяет ограничения доступа. для объявленной переменной. [/list]
[b]Обнаружена новая проблема: почему я не могу получить доступ к getClass()? [/b] [img]https://i.sstatic.net/gYAxY4dI.png[/img]
Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это просто синтаксический...
Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это просто синтаксический...
Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это просто синтаксический...
Сегодня, работая над проектом курса «Шаблоны проектирования» в колледже (требуется Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которую можно обойти, объявив var. Я знаю, как используется var, это просто синтаксический...
Сегодня, работая над проектом для курса «Паттерны проектирования» в колледже (Java 11), я обнаружил проблему с ограничением доступа модификатора доступа, которая может быть обошрена путем объявления VAR. Я знаю, как используется VAR, это просто...