Review request for java.text.** warning cleanup

John Rose john.r.rose at oracle.com
Tue Dec 6 17:26:46 PST 2011


On Dec 5, 2011, at 12:30 PM, Deepak Bhole wrote:

>>   Since this is an important point, I checked into it.  Result: Wildcards
>>   cannot (in general) be compatibly switched with named type parameters
>>   in public APIs.
>>   See the demonstration here:
>>     [1]https://gist.github.com/1424776
>>   (This is subject to correction by someone more expert than me in API
>>   evolution, like Alex Buckley, Joe Darcy, or Maurizio Cimadamore.  I'm a
>>   JVM hacker!)
>> 
> 
> Thanks for the pointer! Yes, it is rather unfortunate that it cannot
> changed then :( I have reverted it and added a more localized @SW
> instead.

Good.  I puzzled some more over the localized @SW and found a formulation
that does not require any @SW at all.  It's a matter of choosing wildcards very
carefully.  See patch below.

Basically, it's one of those cases where a type T isn't good enough, but a type
"? extends T" will do the job.  (I can't tell you all such cases, but this is one of them!)

>>   I'm OK with that.  Replacing clone by an equivalent copy constructor
>>   looks trivial enough to me, even though it changes bytecode output.
>> 
> 
> As mentioned in my other email to Rémi, the clone constructor was my
> initial plan but didn't work. Instead I am just initializing a temp var
> (so that I can add a localized @SW) and then assigning the outer scope
> var to it.

Good.

>>   Yep.  SW("serial") seems to be the wrong thing, almost everywhere.
> 
> Out of curiosity, why is this? Is it because not having a serial can
> cause invalid class errors or are there other reasons?

If you don't have a SVUID, the system makes one for you. (It is the same
one your IDE can generate explicitly.)  If you way @SW("serial"), you are
telling the system that it can adjust the SVUID at will.  You get into trouble
with this if somebody adds another (non-transient) field.  This changes the
implicit SVUID.  This can lead to surprising results down the road.

> Thanks for taking a look. New webrev:
> http://cr.openjdk.java.net/~dbhole/java.text-warning-cleanup/webrev.02/
> 
> As with before, diff between rev 01 and 02 is there too:
> http://cr.openjdk.java.net/~dbhole/java.text-warning-cleanup/webrev.02/rev-01-02.patch



On Dec 2, 2011, at 2:12 PM, John Rose wrote:

>>> In the same way, consider pushing the annotation into the body of class AttributeEntry, even though that class is very simple.
>>> 
>> 
>> That one is for the declaration itself -- the warning is about the Map
>> supertype not being parameterized.
> 
> 
> I didn't get that clearly from the comment.  Suggest:
> +// Suppress warning about raw Map.Entry. Parameterizing Map.Entry correctly 
> +// requires changing return of getKey
> ++// Must suppress the whole class to suppress warning about raw supertype Map.Entry.
> ++// Parameterizing Map.Entry correctly would requires changing return of getKey.

I went back to class AttributeEntry and realized that it also does not need @SW.
Since it is a non-public class, it is OK to change the supertype and the return value
of getKey.  A simple correction to the type parameters of a non-public name is in
scope for this project, as I read Stuart here:
  http://mail.openjdk.java.net/pipermail/jdk8-dev/2011-December/000380.html

-+// Must suppress the whole class to suppress warning about raw supertype Map.Entry.
-+// Parameterizing Map.Entry correctly would requires changing return of getKey.
-+ at SuppressWarnings("rawtypes")
-class AttributeEntry implements Map.Entry {
++class AttributeEntry implements Map.Entry<Attribute,Object> {
...
-    public Object getKey() {
++    public Attribute getKey() {

(I could be mistaken about this; please double check.  I made a public API
mistake in my own java.lang.invoke warnings cleanup!)

Also, I noticed some extraneous blank lines surrounding @SW occurrences.
They aren't needed.  Also, a few occurrences of @SW({"foo"}) do not need
the braces:  @SW("foo").

Here are all the adjustments I suggest, in one patch:
  https://gist.github.com/1440966

See if they work for you.  If so, we're done.

-- John


More information about the jdk8-dev mailing list