Это допускается:Java Внешний класс расширяет статический внутренний класс
public class Outer {
public static class Inner extends Outer { }
}
, но это не так:
public class Outer extends Inner {
public static class Inner { }
}
Во втором случае компилятор жалуется Cyclic inheritance involving package.Outer
. Я не вижу никаких задействованных циклов; почему второй случай недействителен?
Это ведет себя так же, как Inner is class
, abstract class
, или interface
.
Вариант использования предназначен для рекурсивной структуры данных - пространства имен символов. В принципе, я хочу структуру именования Namespace extends Namespace.Member
, MyDataChunk extends Namespace.Member
; каждый Namespace
будет действовать как карта от String
до Namespace.Member
, что позволяет рекурсировать несколько уровней Namespace
, заканчивающихся MyDataChunk
.
Вы не видите никаких циклов, но это рекурсивная структура данных. Это кажется противоречивым. См. Также http://stackoverflow.com/questions/33918022/cyclic-inheritance-and-interfaces-class-a-cant-implement-class-b-interface-wh – Tunaki
@Tunaki Если я читаю это правильно, типы не должны ездить на велосипеде; фактическая рекурсия еще не существует (член «Карта')). –
CAD97
@Tunaki Циклическое наследование - это 'A extends B' и' B extends A', а рекурсивная структура данных - 'A {member A}'. Начиная с вышеуказанного кода, ни один из них не должен присутствовать, если я правильно читаю, хотя компилятор жалуется на первый. – CAD97