Hello Florian

So, does  everybody agree?

Would be great to also have opinions from someone working at Sun?

Sorry for delay

public E[] getSelectedValues() looks ok at the first glance
(but I didn't do all testing)

there is no way to create a generified array like this:
E[] array = new E[10];

but you can use the following workaround:

@SuppressWarnings("unchecked")
E[] array = (E[])new Object[10];

Generification is a challenging task,
because it must be backward compatible,
fortunately compatibility was one of the main feature of generics

Thanks
alexp


Pavel, especially your opinion is quite important since you will probably be the one who will have to eventually accept and commit my patch. :-)

-Florian

Am Dienstag, 30. Dezember 2008 schrieb Jonathan Giles:
Florian,

Your proposed solution of deprecating the old method and referring to
the new method seems like a good idea to me.

Cheers,
Jonathan Giles

Florian Brunner wrote:
Hi,

I hope you all had a Merry Christmas! I started now to add generics to
ListModel and JList. While adding generics to the ListModel is quite
straightforward, I think, there are some issues with JList, I would
like to dicuss. I start here with the first issue: getSelectedValues

Am I right, that there is no way to change the signature of this
method to:

public E[] getSelectedValues()

where E is the type parameter of the class?

(Because of generic array creation, which is not supported by Java.)

Here is the current implementation:

public Object[] getSelectedValues() {

ListSelectionModel sm = getSelectionModel();

ListModel dm = getModel();

int iMin = sm.getMinSelectionIndex();

int iMax = sm.getMaxSelectionIndex();

if ((iMin < 0) || (iMax < 0)) {

return new Object[0];

}

Object[] rvTmp = new Object[1+ (iMax - iMin)];

int n = 0;

for(int i = iMin; i <= iMax; i++) {

if (sm.isSelectedIndex(i)) {

rvTmp[n++] = dm.getElementAt(i);

}

}

Object[] rv = new Object[n];

System.arraycopy(rvTmp, 0, rv, 0, n);

return rv;

}

If this is not possible I propose to add a new method:

public List<E> getSelectedItems()

and deprecate getSelectedValues:

...

* @deprecated As of JDK 1.7, replaced by {...@link #getSelectedItems()}

*/

@Deprecated

public Object[] getSelectedValues() {

...

}

/**

* Returns a list of all the selected items, in increasing order based

* on their indices in the list.

*

* @return the selected items, or an empty list if nothing is selected

* @see #isSelectedIndex

* @see #getModel

* @see #addListSelectionListener

*

* @since 1.7

*/

public List<E> getSelectedItems() {

ListSelectionModel sm = getSelectionModel();

ListModel<? extends E> dm = getModel();

int iMin = sm.getMinSelectionIndex();

int iMax = sm.getMaxSelectionIndex();

if ((iMin < 0) || (iMax < 0)) {

return Collections.emptyList();

}

List<E> selectedItems = new ArrayList<E>();

for(int i = iMin; i <= iMax; i++) {

if (sm.isSelectedIndex(i)) {

selectedItems.add(dm.getElementAt(i));

}

}

return selectedItems;

}

Note: Ignore for now 'E' vs '? extends E', I will start another thread
for this. I'm just interested if you think it's a good idea to add the
getSelectedItems method and to deprecate getSelectedValues.

So I wish you a Happy New Year and hope to hear from you soon.

-Florian



Reply via email to