Swing generification changes in JDK 9 b24 -- swing generification refinements in JDK 9 b30

Joe Darcy joe.darcy at oracle.com
Wed Sep 17 04:11:31 UTC 2014


Hello swing developers,

In response to the earlier call for feedback on the initial swing 
generification changes, several bugs were filed and fixed:

     JDK-8054360: Refine generification of javax.swing
     https://bugs.openjdk.java.net/browse/JDK-8054360

     JDK-8055254: Address source incompatability of JSlider generification
     https://bugs.openjdk.java.net/browse/JDK-8055254

These fixes are now present in JDK 9 b30:

     https://jdk9.java.net/download/

Please give b30 a try when recompiling your favorite swing code base and 
report on how the refined generification works.

Thanks,

-Joe

On 8/5/2014 9:25 AM, Joe Darcy wrote:
> Hello,
>
> A quick follow-up, I've filed
>
>     JDK-8054360: Refine generification of javax.swing
> https://bugs.openjdk.java.net/browse/JDK-8054360#comment-13532821
>
> to tweak the generification of TreeNode and possibly a few other types.
>
> Thanks for the feedback,
>
> -Joe
>
> On 7/30/2014 7:54 AM, Joe Darcy wrote:
>> Hi Andrej and Martijn,
>>
>> Thanks for responding.
>>
>> On 7/28/2014 5:04 AM, Andrej Golovnin wrote:
>>> Hi Joe,
>>>
>>> I'm not sure if it is what you are looking for.
>>
>> For context, the general evolution policy of the JDK:
>>
>> http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html#general_evolution_policy 
>>
>>
>> includes "avoid introducing source incompatibilities." As this is a 
>> large generification change to swing, some level of source 
>> incompatibility may be acceptable in a platform release like JDK 9, 
>> but if there are very widespread issues, some of the changes may be 
>> reconsidered.
>>
>> The request to try out the changes was to get enough information to 
>> see if any (partial) reconsideration was warranted.
>>
>>
>>> But I tried to compile my project with the new build. And I got a 
>>> compile error in one of my classes. I have a class which implements 
>>> the TreeNode interface and looks like this:
>>>
>>> class MyTreeNode implements TreeNode {
>>> ....
>>>     @Override
>>>     public Enumeration<MyTreeNode> children() {
>>>         return ....;
>>>     }
>>> ...
>>> }
>>>
>>> The error message is: "return type Enumeration<MyTreeNode> is not 
>>> compatible with Enumeration<TreeNode>".
>>>
>>> If I change (see attached patch) the definition of the 
>>> children()-method in the TreeNode-interface to:
>>>
>>> public interface TreeNode {
>>> ...
>>>     Enumeration<? extends TreeNode> children();
>>> ...
>>> }
>>>
>>> then my code compiles.
>>
>> That design issue was raised during code review:
>>
>> http://mail.openjdk.java.net/pipermail/swing-dev/2014-June/003643.html
>>
>> "It was not immediately clear how javax.swing.tree.TreeNode.children(),
>> which returns a raw Enumeration, should be generified. I changed it to
>>
>>      Enumeration<TreeNode> children();
>>
>> and that seems to work fine. Something like
>>
>>      Enumeration<? extends TreeNode>
>>
>> with a covariant override would save a few casts in a private
>> implementation, but generally doesn't seem to be a good trade-off since
>> many normal clients could be inconvenienced dealing with the wildcard."
>>
>> If generified subclasses of TreeNode are common, the generification 
>> of children may need reconsideration.
>>
>>>
>>> BTW, a good test for your changes would be to try to compile 
>>> NetBeans and/or IntelliJ IDEA using the new JDK 9 build. They both 
>>> are really big Swing applications which make use maybe of all Swing 
>>> APIs.
>>>
>>>
>>
>> My preference would be for the NetBeans and IntelliJ teams to do that 
>> task :-)
>>
>> Thanks,
>>
>> -Joe
>



More information about the jdk9-dev mailing list