The following code (in a file called Bad.java) compiles and runs in eclipse (in particular galileo with Build id: 20100218-1602):
public class Bad<T> {
public abstract static class Base<S extends Base<S>> {
public Base(Class<S> sClass) {
Class<S> theClass = sClass;
System.out.println(theClass);
System.out.println(sClass);
}
}
public class Arr extends Base<Arr> {
public Arr() {
super(Arr.class);
System.out.println(Arr.class);
}
}
public static void main(String[] args) {
Bad<Integer> bad = new Bad<Integer>();
Bad<Integer>.Arr a = bad.new Arr();
System.out.println(a);
}
}
However, javac (I've tried 1.5, 1.6 and 1.7) gives this error:
Bad.java:13: cannot find symbol
symbol : constructor Base(java.lang.Class<Bad.Arr>)
location: class Bad.Base<Bad<T>.Arr>
super(Arr.class);
^
1 error
If I change the argument of the Base ctor to "Class sClass" (removing the <S>) javac is happy, though of course there are warnings in both eclipse and javac.
This is on various flavors of Linux if that matters.
Which compiler is correct? I'm wondering if I should I file a bug with eclipse or Sun.