Но модификаторы «запечатанные» и разрешений влияют только на непосредственных дочерних классов класса; мне это кажется не совсем правильным. В частности, вы можете получить произвольные подклассы запечатанного класса, используя незапечатанный класс "shim"/backdoor:
Код: Выделить всё
public sealed class Shape permits Ellipse, Polygon { /* ... */ }
public non-sealed class Ellipse extends Shape { /* ... */ }
public class RealEllipse1 extends Ellipse { /* ... */ }
public class RealEllipse2 extends Ellipse { /* ... */ }
public class RealEllipse3 extends Ellipse { /* ... */ }
// and so on
Похоже, это противоречит намерению пометить класс как запечатанный. Если разрешенные подклассы могут быть произвольными подклассами, у вас фактически будут произвольные подклассы (если не прямые подклассы) запечатанного класса, а соответствующие операторы и проверка типов являются транзитивными, то есть такие вещи работают, верно?
Код: Выделить всё
Shape aShape = new RealEllipse2();
RealEllipse1 anotherShape = new RealEllipse1();
if (anotherShape instanceof Shape) {
// this executes; instanceof says anotherShape is an instance of Shape
}
(Это связано с этим вопросом.)
Подробнее здесь: https://stackoverflow.com/questions/797 ... interfaces
Мобильная версия