Well, there is probably no big issue with JList, because the ListModel is 
immutable.

But when we add generics to JComboBox, which is similar to JList, the situation 
is a bit more 
controversial, because the ComboBoxModel is mutable.

So if we have something like this:
class JComboBox<E>{
ComboBoxModel<? extends E> getModel();
setModel(ComboBoxModel<? extends E>);
}

then something like this is not possible:
JComboBox<Foo> cb = new JComboBox<Foo>(...);
...
Foo foo;
ComboBoxModel<? extends Foo> model = cb.getModel();
model.setSelectedItem(foo); -> compile time error

You would need to do an unchecked (-> not type-safe) cast first:
ComboBoxModel<Foo> model = (ComboBoxModel<Foo>) cb.getModel();

And type-safty is what generics is all about.

-Florian

Am Dienstag, 3. Februar 2009 schrieb Pavel Porvatov:
> Hi Florian,
>
> > ----------------------------------------
> >
> > public JList(ListModel dataModel)
> >
> > {
> >
> > if (dataModel == null) {
> >
> > throw new IllegalArgumentException("dataModel must be non null");
> >
> > }
> >
> > // Register with the ToolTipManager so that tooltips from the
> >
> > // renderer show through.
> >
> > ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
> >
> > toolTipManager.registerComponent(this);
> >
> > layoutOrientation = VERTICAL;
> >
> > this.dataModel = dataModel;
> >
> > selectionModel = createSelectionModel();
> >
> > setAutoscrolls(true);
> >
> > setOpaque(true);
> >
> > updateUI();
> >
> > }
> >
> > --->
> >
> > public JList(ListModel<E> dataModel)
> >
> > {
> >
> > if (dataModel == null) {
> >
> > throw new IllegalArgumentException("dataModel must be non null");
> >
> > }
> >
> > // Register with the ToolTipManager so that tooltips from the
> >
> > // renderer show through.
> >
> > ToolTipManager toolTipManager = ToolTipManager.sharedInstance();
> >
> > toolTipManager.registerComponent(this);
> >
> > layoutOrientation = VERTICAL;
> >
> > this.dataModel = dataModel;
> >
> > selectionModel = createSelectionModel();
> >
> > setAutoscrolls(true);
> >
> > setOpaque(true);
> >
> > updateUI();
> >
> > }
> >
> > We could define the signature also like this:
> >
> > public JList(ListModel<? extends E> dataModel)
> >
> > but then we would have to define the dataModel-field also with:
> >
> > private ListModel<? extends E> dataModel
> >
> > as well as the model-property. I don't think this would be a good idea
> > and thus define the signature as:
> >
> > public JList(ListModel<E> dataModel)
> >
> > What do you think?
>
> Why do you think that "private ListModel<? extends E> dataModel" is not
> a very good idea?
>
> Regards, Pavel


Reply via email to