<Swing Dev> [PATCH] 6179357: Generics: JList

Florian Brunner fbrunnerlist at gmx.ch
Thu Nov 26 11:50:08 UTC 2009


Hi Pavel,

thanks for pointing this out. I can remember the discussion but not 
Alexander Potochkin's solution. I will check it in detail as soon as I 
find some time.

-Florian

Pavel Porvatov schrieb:
> Hi Florian,
>
> I'd like to return to some old discussion:
>> In the case of JComboBox I think it's not even possible to define
>> something like:
>>
>>  class JComboBox<E>{
>>  ComboBoxModel<? extends E> getModel();
>>  setModel(ComboBoxModel<? extends E>);
>>  }
>>
>> because JComboBox internally uses the ComboBoxModel.setSelectedItem
>> method.
>>
>> So the question is what do you think is better:
>>
>> 1) To look at each component individually and try to make each as
>> flexible as possible. So in the JList/ JComboBox case this would mean:
>>
>>  class JList<E>{
>>  ListModel<? extends E> getModel();
>>  setModel(ListModel<? extends E>);
>>  }
>>
>> but
>>
>>  class JComboBox<E>{
>>  ComboBoxModel<E> getModel();
>>  setModel(ComboBoxModel<E>);
>>  }
>>
>> 2) Make the interfaces as consistent as possible over all components.
>> This would mean for the JList case to use somethink like:
>>  class JList<E>{
>>  ListModel<E> getModel();
>>  setModel(ListModel<E>);
>>  }
>>
>> This approach is slightly less flexible than the approach 1), but cases
>> where one could benefit from approach 1) are probably rare and there are
>> various work-arounds (like: wrapping the model/ use a common base class
>> for the generic parameter/ use raw type/... )
>>
>> So what do you think? Approach 1) or 2)?
> As you remember three people voted for the second variant...
>
> Alexander Potochkin found a third solution that seems better than 
> previous ones.
> 3)
> class JList<E>{
> ListModel<? extends E> getModel();
> setModel(ListModel<? extends E>);
> }
>
> AND
>
> class JComboBox<E>{
> ComboBoxModel<? extends E> getModel();
> setModel(ComboBoxModel<? extends E>);
> }
>
> Below is a quote of his mail, which clarifies possibility of such 
> solution:
> -------------------------------------------------
> I thought a bit more on the generification of the JComobBox and its 
> model and now I am pretty sure that we should not generify
> ComboBoxModel.get/setSelectedItem(Object)
>
> The attached test case illustrates the reason
>
> - Run the test
> - Press enter
> - The selected item will be printed in the console "1" (integer type)
>
> - Write "hello" in the editable combobox
> - Press enter
> - "hello" will be printed (String type)
>
> As you see it is a valid situation when the type of the selected value
> differs from the general type of the JComboBox and its model
>
> By the way the spec of the JComboBox.getSelectedItem()
> underlines this fact:
>
>     * If the combo box is editable, then this value may not have been 
> added
>     * to the combo box with <code>addItem</code>, 
> <code>insertItemAt</code>
>     * or the data constructors.
> -------------------------------------------------
> So, I think we should make a new change for changing generification of 
> JList from ListModel<E> to ListModel<? extends E>. What do you think 
> about that?
>
> Regards, Pavel
>> Great news, thanks!
>>
>> I'll write soon to plan the next steps.
>>
>> -Florian
>>
>> Am Montag, 23. November 2009 schrieb Alexander Potochkin:
>>  
>>> Wow!
>>> Congratulations Pavel & Florian!
>>>
>>> Thanks
>>> alexp
>>>
>>>    
>>>> Hi Florian,
>>>>
>>>> I've got an approve for the fix and committed it:
>>>> http://hg.openjdk.java.net/jdk7/swing/jdk/rev/7bcb1864f424
>>>>
>>>> Thanks for your work,
>>>> Pavel
>>>>       
>




More information about the swing-dev mailing list