Swing generification changes in JDK 9 b24
Joe Darcy
joe.darcy at oracle.com
Tue Aug 5 16:25:52 UTC 2014
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