Dobrý den,

Collator je určen jen pro Stringy. Nevím přesně, od jaké verze Javy tato třída 
existuje, ale předpokládám, že tam byla už v 1.4. Takže bych si docela tipnul, 
že důvodem pro implementaci pomocí přetypování na String (a taky proč je to 
Comparator<Object> a ne Comparator<String>) je zpětná kompatibilita.

Já používám docela často Guavu a tam bych to řešil takto:
Ordering.from(vasCollator).onResultOf(Functions.toStringFunction())
nebo prostě jen
Ordering.natural().onResultOf(Functions.toStringFunction())

Tomáš Záluský


================================================
...with Ultimate flying is so easy...
http://www.frisbee.cz    http://www.peaceegg.net
================================================





______________________________________________________________
> Od: "Libor Jelinek" <[email protected]>
> Komu: Java <[email protected]>
> Datum: 03.08.2011 15:14
> Předmět: ClassCastException při přetypování v Collator.compare(Object, Object)
>
>Dobrý den,
>při třídění hodnot JXTable (ale přepokládám, že i obyčejná JTable)
>používá compare(Object,
>Object) z třídy java.text.Collator. Podle javadocu i zdrojáku v
>sun-java6-jdk k metodě je vyloženě napsáno, že jen zavolá compare((String)
>o1, (String) o2):
>
>public int compare(Object o1, Object o2) {
>  return compare((String)o1, (String)o2);
>}
>
>Kvůli tomuto přetypování ovšem velmi lehce vyhazuje "ClassCastException:
><neco> cannot be cast to String". Neměla by spíše používat toString()? Tím
>by k ničemu nedocházelo. toString() funguje jednoduše vždy.
>
>public int compare(Object o1, Object o2) {
>  return compare(o1.toString(), o2.toString());
>}
>
>
>Protože v mém případě JTable pracuje převážně s třídou Object, pak v
>podstatě dělá JDK toto:
>
>public class CastTest {
>    public static void main(String[] args) {
>        Object o = new Double("3.14");
>
>        System.out.println((String) o);* // ClassCastException!!!*
>    }
>}
>
>*Celý stack trace:*
>java.lang.ClassCastException: cz.aerocan.reprodb.artworkmodel.ArtworkType
>cannot be cast to java.lang.String
>    at java.text.Collator.compare(Collator.java:310)
>   at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:951)
>    at javax.swing.DefaultRowSorter.access$100(DefaultRowSorter.java:95)
>   at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1359)
>    at
>javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1349)
>   at java.util.Arrays.mergeSort(Arrays.java:1144)
>    at java.util.Arrays.sort(Arrays.java:1079)
>   at
>javax.swing.DefaultRowSorter.sortExistingData(DefaultRowSorter.java:536)
>    at javax.swing.DefaultRowSorter.setSortKeys(DefaultRowSorter.java:304)
>   at
>org.jdesktop.swingx.sort.DefaultSortController.toggleSortOrder(DefaultSortController.java:142)
>    at
>javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(BasicTableHeaderUI.java:96)
>   at
>java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
>    at java.awt.Component.processMouseEvent(Component.java:6291)
>   at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
>    at java.awt.Component.processEvent(Component.java:6053)
>   at java.awt.Container.processEvent(Container.java:2041)
>    at java.awt.Component.dispatchEventImpl(Component.java:4651)
>   at java.awt.Container.dispatchEventImpl(Container.java:2099)
>    at java.awt.Component.dispatchEvent(Component.java:4481)
>   at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
>    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
>   at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
>    at java.awt.Container.dispatchEventImpl(Container.java:2085)
>   at java.awt.Window.dispatchEventImpl(Window.java:2478)
>    at java.awt.Component.dispatchEvent(Component.java:4481)
>   at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
>    at java.awt.EventQueue.access$000(EventQueue.java:84)
>   at java.awt.EventQueue$1.run(EventQueue.java:602)
>    at java.awt.EventQueue$1.run(EventQueue.java:600)
>   at java.security.AccessController.doPrivileged(Native Method)
>    at
>java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
>   at
>java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
>    at java.awt.EventQueue$2.run(EventQueue.java:616)
>   at java.awt.EventQueue$2.run(EventQueue.java:614)
>    at java.security.AccessController.doPrivileged(Native Method)
>   at
>java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
>    at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
>   at
>org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
>[catch] at
>java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
>   at
>java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
>    at
>java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
>   at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
>    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
>   at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
>
>Díky
>Libor
>

Odpovedet emailem