Почему статический доступ к классу должен быть ограничен именем класса


Почему я должен квалифицировать ссылку на class внутри класса, в котором она определена? Например:

public class Foo {
    private static Logger log = LoggerFactory.getLogger(Foo.class);
}

Почему я не могу просто вызвать LoggerFactory.getLogger(class), поскольку я уже нахожусь в контексте класса Foo?

1 2

1 ответ:

JLS определяет

15.8.2. Литералы Класса

Литерал класса-это выражение, состоящее из имени класса, интерфейса, массива, примитивного типа или псевдотипа void, за которым следует a '.- и жетон class.

Это не сделает язык неоднозначным, чтобы разрешить class , где выражение, как ожидается, позволит синтаксис, который вы описываете, но это будет включать переопределение ключевого слова class, чтобы означать оба

  1. своего рода декларация
  2. Ссылка на экземпляр типа Class.
Предложенный вами синтаксис может позволить назвать класс анонимного класса, но getClass() будет иметь то же значение в анонимных классах.

Избавление от двух маркеров (безусловного имени класса и .) не дает большого значения, и это может вызвать путаницу внутри внутреннего класса. Например, что такое class внутри лямбда-выражения?