2016-09-12 3 views
0

Это допускается: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.

+0

Вы не видите никаких циклов, но это рекурсивная структура данных. Это кажется противоречивым. См. Также http://stackoverflow.com/questions/33918022/cyclic-inheritance-and-interfaces-class-a-cant-implement-class-b-interface-wh – Tunaki

+0

@Tunaki Если я читаю это правильно, типы не должны ездить на велосипеде; фактическая рекурсия еще не существует (член «Карта ')). – CAD97

+0

@Tunaki Циклическое наследование - это 'A extends B' и' B extends A', а рекурсивная структура данных - 'A {member A}'. Начиная с вышеуказанного кода, ни один из них не должен присутствовать, если я правильно читаю, хотя компилятор жалуется на первый. – CAD97

ответ

4

Я не вижу никаких циклов участвуют

Я: Outer не может распространяться Outer.Inner, если он не существует. Для Outer.Inner существует, Outer должен существовать. Это Catch-22, циклическая зависимость.

+1

Это становится еще более очевидным, если мы назовем вложенный класс 'member type' как [JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html# JLS-8.1.6). – biziclop

+1

Это имеет смысл; Я думал, что это не будет вести себя с 'static'. Вот почему я спросил! – CAD97

Смежные вопросы