Почему javac жалуется на дженерики, не связанные с аргументами типа класса?

Пожалуйста, прочтите комментарии в коде по порядку, подробности вопроса там.
Почему возникает такая разница?
Пожалуйста, укажите JLS, если это возможно.

import java.util.*;

/**
 * Suppose I have a generic class
 * @param <T> with a type argument.
 */
class Generic<T> {
    // Apart from using T normally,
    T paramMethod() { return null; }
    // the class' interface also contains Generic Java Collections
    // which are not using T, but unrelated types.
    List<Integer> unrelatedMethod() { return null; }
}

@SuppressWarnings("unused")
public class Test {
    // If I use the class properly (with qualified type arguments)
    void properUsage() {
        Generic<String> g = new Generic<String>();

        // everything works fine.
        String s = g.paramMethod();
        List<Integer> pos = g.unrelatedMethod();

        // OK error: incompatible types: List<String> := List<Integer>
        List<String> thisShouldErrorCompile = g.unrelatedMethod();
    }

    // But when I use the raw type, *ALL* the generics support is gone, even the Collections'.
    void rawUsage() {
        // Using Generic<?> as the type turns fixes the warnings below.
        Generic g = new Generic();

        // OK error: incompatible types: String := Object
        String s = g.paramMethod();

        // WTF warning: unchecked conversion: List<Integer> := raw List
        List<Integer> pos = g.unrelatedMethod();

        // WTF warning: unchecked conversion: List<String> := raw List
        List<String> thisShouldErrorCompile = g.unrelatedMethod();
    }
}

Примечание

Первоначально я нашел это в IntelliJ IDEA, но я предполагаю, что этот компилятор совместим с javac, потому что, когда я скомпилировал приведенный выше код со следующим, он выдал те же ошибки/предупреждения.

$ javac -version
javac 1.7.0_05
$ javac Test.java -Xlint:unchecked
...
$ javac Test.java -Xlint:unchecked -source 1.5 -target 1.5
...

person TWiStErRob    schedule 05.12.2014    source источник


Ответы (1)


Из Необработанные типы JLS 4.8

Использование необработанных типов разрешено только в качестве уступки совместимости с устаревшим кодом. Использование необработанных типов в коде, написанном после введения дженериков в язык программирования Java, настоятельно не рекомендуется.

а также

Тип конструктора (§8.8), метода экземпляра (§8.4, §9.4) или нестатического поля (§8.3) M необработанного типа C, который не унаследован от его суперклассов или суперинтерфейсов, является необработанным типом, который соответствует к стиранию его типа в универсальном объявлении, соответствующем C.

Что, если внимательно прочитать, означает, что все типы стираются, а не только тип, который вы пропустили.

person OldCurmudgeon    schedule 05.12.2014