The rule is that no instantiation can be used. The scope is qualified using the raw type. This is because there is only one instance of a static member per type. Example (of a generic type with static members): public final class Counted { public static final int MAX = 1024; public static class BeyondThresholdException extends Exception {} private static int count; public static int getCount() { return count; } private final T value; public Counted(T arg) throws BeyondThresholdException { value = arg; count++; if (count >= 1024) throw new BeyondThresholdException(); } public void finalize() { count–; } public T getValue() { return value; } } int m = Counted .MAX; // ok int k = Counted .MAX; // error int n = Counted > .MAX; // error try { Counted>[] array = null; array[0] = new Counted(10L); array[1] = new Counted(“abc”); } catch ( Counted .BeyondThresholdException e) { e.printStackTrace(); } System.out.println( Counted .getCount()); // ok System.out.println