Perché javac si lamenta di generici non correlati agli argomenti di tipo della class?

Si prega di leggere i commenti nel codice in ordine, i dettagli della domanda sono lì.
Perché sta succedendo questa differenza?
Si prega di citare il JLS se ansible.

import java.util.*; /** * Suppose I have a generic class * @param  with a type argument. */ class Generic { // 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 unrelatedMethod() { return null; } } @SuppressWarnings("unused") public class Test { // If I use the class properly (with qualified type arguments) void properUsage() { Generic g = new Generic(); // everything works fine. String s = g.paramMethod(); List pos = g.unrelatedMethod(); // OK error: incompatible types: List := List List 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 := raw List List pos = g.unrelatedMethod(); // WTF warning: unchecked conversion: List := raw List List thisShouldErrorCompile = g.unrelatedMethod(); } } 

Nota a margine

Originariamente l’ho trovato in IntelliJ IDEA, ma immagino che il compilatore sia compatibile con javac perché quando ho compilato il codice precedente con il seguente ho fornito gli stessi errori / avvertimenti.

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

Dai tipi di JLS 4.8 Raw

L’uso di tipi grezzi è consentito solo come concessione alla compatibilità del codice legacy. L’uso di tipi grezzi nel codice scritto dopo l’introduzione di generici nel linguaggio di programmazione Java è fortemente scoraggiato.

e

Il tipo di un costruttore (§8.8), il metodo di istanza (§8.4, §9.4) o il campo non statico (§8.3) M di un tipo non elaborato C che non è ereditato dalle sue superclassi o superinterfacce è il tipo grezzo che corrisponde alla cancellazione del suo tipo nella dichiarazione generica corrispondente a C.

Il che, se lo leggi attentamente, implica che tutti i tipi vengono cancellati , non solo il tipo che hai tralasciato.