Разрешено ли компилятору Java быть чувствительным к потоку для статических вызовов?

Вот краткий пример из раздела 8.4.8.2 JLS.

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + ", " + s.name());
    }
}

Согласно обсуждению примера, результатом работы main()будет «Спокойной ночи, Дик». Это связано с тем, что статические методы вызываются на основе статического типа переменной/выражения, для которых они вызываются.

Вот мой вопрос :Любой компилятор, даже умеренно чувствительный к потоку -, может выяснить, что тип любого объекта, хранящегося в sво время вызова, всегда должен быть Sub, поэтому, если бы компилятору было разрешено использовать эта информация, даже вызов статических методов, может иметь некоторое ощущение динамической привязки. Почему это не разрешено? Есть ли у Java явная цель, чтобы каждый компилятор создавал байт-код, который ведет себя точно так же, или есть какая-то другая причина?

5
задан JasonMArcher 21 October 2014 в 21:08
поделиться