Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java generics Eclipse compiler bug?

My question is a follow up of an other guy's question: Unbounded wildcard passed to method

He was interested why the following code compiled:

public class ColTest {
    static<T> T wildSub(ArrayList<? extends T> holder, T arg){
        T t=holder.get(0);
        return t;
    }

    public static void main(String[] args) {
        ArrayList<?> list=new ArrayList<Long>(Arrays.asList(2L,3L,7L));
        Long lng=1L;
        ColTest.wildSub(list, lng);
    }
}

We came to a conclusion that the trick was that compiler inferred the ? as an Object and made the following Long argument pass thanks to the trivial inheritance of Object->Long.

The code does compile using Sun/Oracle javac (I use 1.6.0_26-b03), but does not compile in Eclipse (I use Helios) where it displays the following compilation error:

The method wildSub(ArrayList<? extends T>, T) in the type ColTest is not applicable for the arguments (ArrayList<capture#2-of ?>, Long)

My question is:

Is this a bug in the Java compiler implementation Eclipse uses or some kind of ambiguity in Java 'generics inference algorithm' specification that is valid and just implemented differently by Eclipse?

like image 874
MarianP Avatar asked Jan 20 '26 11:01

MarianP


1 Answers

It appears to be an Eclipse bug.

T should be inferred to as Object, per 15.12.2.7.

15.12.2.8 also has a catch-all clause: "Any remaining type variables that have not yet been inferred are then inferred to have type Object"

with T=Object, per 15.12.2.2, the method is applicable.

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12

like image 78
irreputable Avatar answered Jan 23 '26 01:01

irreputable



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!