Я думаю, это потому, что как вы собираетесь иметь дело с объектом в вызываемой стороне, можно отложить до последнего момента. Например, предположим, что
private static class X{
}
public static MyClass.X getX() {
return new MyClass.X();
}
затем из другого класса, я что-то вроде
public void get() {
System.out.println(MyClass.getX());
}
мне не нужно знать, что X тип здесь, потому что Println просто хочет его ToString(), который унаследованный от объекта.
Другой пример
private static class X implements Serializable{
}
public static MyClass.X getX() {
return new MyClass.X();
}
В этом случае я не знаю X, но я знаю, что это Serializable, так что я могу сделать что-то вроде
public void get() {
Serializable x= MyClass.getX();
}
То, что я не могу сделать, конечно, следует использовать тип X извне MyClass, но до тех пор, пока он мне действительно не понадобится, это просто еще один экземпляр объекта
Это невозможно. Пожалуйста, разместите код. Я предполагаю, что подпись метода _returns_ является общедоступным интерфейсом (или подобным), тогда как реализация метода возвращает частный подкласс этого интерфейса. Это разрешено. – Seelenvirtuose
@Seelenvirtuose: It * is * возможно, удивительно. Похоже на недостаток дизайна Java. (C# не допускает этого.) –
А, ок. Понимаю. Простое техническое объяснение. В рамках этого описания метода (частный) класс является видимым и поэтому может использоваться как тип возврата в сигнатуре метода. Однако этот метод можно вызвать только внутри этого класса. Код в каждом другом классе не может вызвать этот метод из-за невозможности доступа к этому частному классу. – Seelenvirtuose