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 >
