Необработанные типы с универсальными методами, независимыми от универсального типа

Это продолжение кchrertвопросОбщие классы с коллекционным геттером других типов, Если вы можете придумать лучшее название для моего вопроса, не стесняйтесь редактировать его:

Следующий код содержит универсальный классGenericClass<T> с методом возвращаемого типаT и другой метод с типом возвратаCollection<String>который, очевидно, не зависит отT.

Теперь, если я создаю сырьеGenericClass (что я бы никогда не сделал, так что этот вопрос - скорее теоретический вопрос, чтобы помочь понять, что происходит), тогда вызов этого метода в расширенном цикле for не будет работать, потому что вся информация об универсальных типах, похоже, теряется при использовании необработанных типов , Но затем, при вызове того же метода в присваивании, он работает (предупреждает о небезопасном типе, но компилирует).

На мой взгляд, либо оба не должны работать, либо оба должны работать. Я не понимаю, почему один работает, а другой нет. У вас есть какие-либо подсказки или вы знаете какие-либо части JLS, которые объясняют это поведение?

public class GenericClass<T>  {

    T doSomething() {
        return null;
    }

    Collection<String> getCollection() {
        return Collections.emptyList();
    }

    public static void main(String[] args) {
        GenericClass raw = new GenericClass();
        // This will not compile (Error message below)
        for (String str : raw.getCollection()) {
            // Type mismatch: cannot convert from element type Object to String
        }
        // This is only a warning:
        // Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<String>
        Collection<String> coll = raw.getCollection();
        for (String string : coll) {
            // works just fine
        }
    }
}

Есть связанный вопрос, который вместе с принятым ответом объясняет, что происходит довольно хорошо:Почему этот общий код Java не скомпилируется?

Ответы на вопрос(1)

Ваш ответ на вопрос