[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[platform-dev] generics: different behaviour between Eclipse 3.2 and Sun's javac

I have the problem that Eclipse 3.2 and Sun's javac behave differently for Java generics. Eclipse accepts more, or Sun's javac (up to Java 6 Beta 2) is more strict, or one of them is buggy.

Example 1:

   public <T> Class<? extends T> fooGetClass(final T object) {
       return object.getClass();

Eclipse reports no warnings. javac says:

smood/GetClassTest.java:6: incompatible types
found   : java.lang.Class<capture of ? extends java.lang.Object>
required: java.lang.Class<? extends T>
               return object.getClass();

I think I've read that this is an exception in the JLS, which Eclipse supports correctly, but I'm not sure. If I use a cast

public <T> Class<? extends T> fooGetClass(final T object) {
return (Class<? extends T>) object.getClass();
javac doesn't complain (it compiles the code), but Eclipse reports a necessary cast.

Example 2:

public static <T extends Comparable<T>> T readComparableParameter(ComparableParameter<T> parameter {
// some code

using it in

for (ComparableParameter<? extends Comparable<?>> parameter: parameterSet)

leads to a pattern matching problem in javac.

I have many of things strange behaviours, specially when using wildcards.

I'm using Java generics since more than 1 year, but still I have sometimes problems. Mostly with erasure. BTW, who invented the bullshit that

   ArrayList<Object> x=new ArrayList<String>();

doesn't work but

   ArrayList<? extends Object> x=new ArrayList<String>();

does? This distinction is absolut useless, and against all OOP principles! It just enforces you to write "? extends" everywhere!

Or that the wildcard is sometimes higher that Object!

Why can't I have the class of Map as Class<Map<?,?>>, but only Class<Map>, even if I can't have Class<Map<K,V>> because of erasure? How can I avoid raw types, as there's a new warning in Eclipse 3.2, when this doesn't work. But you can create:

Map<?,?>[] mapArray=new Map<?,?>[5];

Sorry for mixing but reports with design problems and listening to my frustrations. But I'm sometimes forced to go back to raw types as I can't figure out how to use generics. Transforming a project of 40'000 LOC in Java to Java 5 is more complicated if you have strange restrictions. Or bugs like http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6218229.