OK now. I wouldn't necessarily agree the generification was poor, and it
was a choice
made by someone else ..
-phil.
On 5/19/2014 12:49 PM, Joe Darcy wrote:
Revised webev at
http://cr.openjdk.java.net/~darcy/8042864.2
Comments below.
On 05/19/2014 12:14 PM, Phil Race wrote:
On 5/19/2014 11:54 AM, Joe Darcy wrote:
http://cr.openjdk.java.net/~darcy/8042864.0/src/share/classes/javax/print/attribute/standard/DialogTypeSelection.java.sdiff.html
< 113 public final Class getCategory() {
> 113 public final Class<DialogTypeSelection> getCategory() {
getCategory() is a super-class method ..
So this seems wrong to me and I think|it should look like this ..|
http://docs.oracle.com/javase/8/docs/api/javax/print/attribute/Attribute.html
|Class
<http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html><?
extends Attribute
<http://docs.oracle.com/javase/8/docs/api/javax/print/attribute/Attribute.html>>|
|getCategory
<http://docs.oracle.com/javase/8/docs/api/javax/print/attribute/Attribute.html#getCategory-->()
|
Part of the generics language feature was covariant overrides, that
is, when a subtype overrides a methods from a supertype, the return
type of the subtype method can be a more-specific type.
That is the case here; DialogTypeSelection is a subtype of "?
extends Attribute" so the getCategory method in DialogTypeSelection
is a covariant override of the superclass method. Moreover, since
the superclass uses the "? extends Attribute" wildcard, the
intention is for subclasses to override this method when possible.
1. FYI it appears I reviewed the .0 version since the reference to
the .1 was so far down I didn't see it
2. I hadn't noticed until now that Henry also mentioned the
getCategory() API ..
3. The 64 (!) other peer subclasses all use Class<? extends Attribute>.
Yes, it will be a DialogTypeSelection but the primary use case is
to be a member of a
collection of Attribute so a more specific API type isn't very
useful at all .. and it
will just stick out like a sore thumb.
It is unfortunate that the other peer subclasses were suboptimally
generified to not use a covariant return when this API was initially
generified. From the sampling of methods I looked all, the methods in
question are final and state something like "This method must return
this specific Class object for the Foo class." Given that
specification, the typing of the getCategory method should reflect the
required behavior of the method and return a Class<Foo> rather than a
Class<? extends Attribute>.
However, to be consistent with the existing poor generification, in
the .2 version of the webrev above I have changed the return type of
the method to the less informative Class<? extends Attribute>.
-Joe
PS I compile the classes before I send them out for a code review so
if there is a type error that would break the build, that is caught
beforehand.