I thought I understood Java Generics.... I can't figure out what the compiler is complaining about in a recent code snippet that I wrote.
I've got a class that wants a class as its argument.
In the sample below, the "Inventor" class implements PatentBase. So the result of the two calls to the constructor are identical, to my eyes. But the compiler thinks differently.
The specific error from the compiler is:
/Users/pfarrell/sandbox/wayserver/wayfinderlib/test/com/wayfinderdigital/struct/ContainedPboListTest.java:67: cannot find symbol
symbol : constructor ContainedPboList(java.lang.Class<capture#480 of ? extends com.wayfinderdigital.busobj.Inventor>)
location: class com.wayfinderdigital.struct.ContainedPboList<com.wayfinderdigital.busobj.Inventor,com.wayfinderdigital.busobj.Patent>
instance = new ContainedPboList<Inventor, Patent>(wizard.getClass());
1 error
I think that lines 3 and 4 are functionally identical in the second code segment. How is "Inventor.class" different from "wizard.getClass()" when the wizard is an Inventor?
Yes, but generics are invariant. Your constructor requires a Class<Inventor>, while you're trying to provide it a Class<? extends Inventor>. Check out the documentation for Object.getClass().
Class<? extends T> is *not* a subtype of Class<T>.
Let's compare it to the cage example:
If line 3 were allowed, we would be able to add butterflies to a cage that was designed for lions only.
I agree. Here's the link: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to
run our stuff on 16 servers instead of 3.