<Swing Dev> [PATCH] 6179357: Generics: JList
Pavel Porvatov
Pavel.Porvatov at Sun.COM
Fri May 15 10:44:55 UTC 2009
Hi Florian,
> Hi Pavel,
>> Hi Florian,
>>
>>> Hi Pavel,
>>>
>>> I don't understand, what exactly you want to do.
>>> DefaultListCellRender implements ListCellRenderer<Object>, which
>>> means it is an implementation, which can be savely (without risking a
>>> ClassCastException) be used with ANY object. That is due the fact,
>>> that it checks if it is an instance of Icon or else calls
>>> Object.toString, which is defined for any Object:
>>>
>>> if (value instanceof Icon) {
>>> setIcon((Icon)value);
>>> setText("");
>>> }
>>> else {
>>> setIcon(null);
>>> setText((value == null) ? "" : value.toString());
>>> }
>> Ok, that code actually prevents to use generics in the
>> DefaultListCellRender class.
> Well, it depends what you mean with "prevents". I guess something like
> the following would still compile (did not test):
>
> public class DefaultListCellRender<E> implements ListCellRenderer<E>{
> public Component getListCellRendererComponent(
> JList<? extends E> list, // or JList<?> ?
> E value,
> int index,
> boolean isSelected,
> boolean cellHasFocus)
> {
> ....
> if (value instanceof Icon) {
> setIcon((Icon)value);
> setText("");
> }
> else {
> setIcon(null);
> setText((value == null) ? "" : value.toString());
> }
> ...
> }
> }
>
> But since:
> - renderers are consumers (-> "super" keyword is used with wildcards)
> and Object is the super type of all types
> - generics are only used at compile time
> - the only generic method is already implemented without casting (except
> in the case of Icon, which cannot be prevented with generics either)
>
> it "prevents" us from the need of introducing a generic type parameter
> here. (If you can live with the subclassing issue I mentioned before.)
>
> If later someone really finds a scenario, which needs that generic
> parameter here (what I doubt), I think it should still be possible to
> change from:
>
> DefaultListCellRender implements ListCellRenderer<Object>
>
> to
>
> DefaultListCellRender<E> implements ListCellRenderer<E>
>
> without breaking backwards compatibility. Correct?
I think the same way.
> So we don't risk anything by not introducing that parameter right now,
> if we don't see any benefit.
>
> What do you think?
I agree that we can introduce that parameter later if needed.
Regards, Pavel.
>
> -Florian
>>
>> Thanks, Pavel
>>
>>>
>>> There is no gain in calling eg.:
>>> new DefaultListCellRender<Foo>()
>>>
>>> because the existing implementation (DefaultListCellRender implements
>>> ListCellRenderer<Object>) already handles Foo.
>>>
>>> The only limitation is with sub-classing: Subclasses cannot change
>>> the parameter type.
>>> But this can be solved with using composition instead of inheritance,
>>> eg:
>>>
>>> public class FooRenderer implements ListCellRenderer<Foo>{
>>> private DefaultListCellRender defaultRenderer = new
>>> DefaultListCellRender();
>>>
>>> public Component getListCellRendererComponent(
>>> JList<? extends Foo> list,
>>> Foo value,
>>> int index,
>>> boolean isSelected,
>>> boolean cellHasFocus)
>>> {
>>> doSomethingWithFoo(foo);
>>> return defaultRenderer.getListCellRendererComponent(list,
>>> value, index, isSelected, cellHasFocus);
>>> }
>>>
>>> private void doSomethingWithFoo(Foo foo){
>>> // do something
>>> }
>>> }
>>>
>>> So, I think the answer is yes, it could be changed, but I see no real
>>> benefit and more, client code needs then to specify a parameter,
>>> which currently it doesn't.
>>>
>>> -Florian
>>>
>>> Pavel Porvatov schrieb:
>>>> Hi Florian,
>>>>
>>>> I have a question about the DefaultListCellRenderer class. Can we
>>>> modify it to use generics?
>>>>
>>>> Thanks, Pavel
>
More information about the swing-dev
mailing list