Не станет ли внутренний класс классом верхнего уровня, если я помещу его в другой файл класса?
Нет, это все еще внутренний класс, который указывает имя файла (IIRC этоOuterClass$InnerClass.class
).
Внутренние классы имеют доступ к атрибутам внешнего класса, т.е. они зависят от экземпляра своего внешнего класса.С интерфейсами вы не могли этого сделать.Представьте себе совершенно не связанный класс, который должен быть создан экземпляром соответствующего внешнего класса.Как бы это сделать, если внешний класс не знает, кто реализует этот интерфейс?
Что вы можете сделать, это объявить статические интерфейсы в вашем внешнем классе, таким образом, просто используя внешний в качестве пространства имен:
public class OuterClass {
public static interface InnerInterface { //protected and private would be fine too, depending on what makes sense
}
}
Редактировать: на самом деле, я неправильно понял вопрос, и поскольку интерфейсы в любом случае являются статическими, вот обновленный фрагмент кода:
public class OuterClass {
public static InnerClass { //static inner class making OuterClass just be a namespace
public interface InnerInnerInterface { //protected and private would be fine too, depending on what makes sense
}
}
}
В качестве обходного пути вы можете определить абстрактный внутренний внутренний класс с недостаткомчто вы должны придерживаться ограничения одиночного наследования.