commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Samuel Fleischle" <>
Subject RE: [lang] ClassCastException in Enum.compareTo with anonymous inner classes
Date Thu, 13 Sep 2007 13:51:18 GMT

I updated from Commons Lang 2.1 to Commons Lang 2.3 and got some issues with the changed compareTo()
method of Enum with anonymouse inner classes:

Here is my simplified Enum:

public class ItemStatus extends Enum
       // -------------------------------------------------- Static Fields
      public static final ItemStatus CANCEL = new ItemStatus("CANCEL", "Cancel");

       public static final ItemStatus SHIPPED = new ItemStatus("SHIPPED", "Shipped") {
       	public String getDisplayName() {
       		// do something special for this status

      public static final ItemStatus MOVED = new ItemStatus("MOVED", "Moved") {
       	public String getDisplayName() {
			// do something special for this status

       /** Contains each status. */
      private static Set statuses;

	// -------------------------------------------------- Instance Fields
	/** Name to display in user interfaces. */
	private final String displayName;

       // --------------------------------------------------- Constructors

      protected ItemStatus(String name, String displayName) {
       	this.displayName = displayName;

      // --------------------------------------------------- Static Methods

       * Returns the item status enumeration object
	 * for the given status name.
       * @param itemStatus
       *            name of the item status
       * @return the enumeration object, or <code>null</code> if it does
       *         exist
      public static ItemStatus valueOf(String itemStatus) {
            return (ItemStatus) getEnum(ItemStatus.class, itemStatus);

      // --------------------------------------------------- Public Methods

       * {@inheritDoc}
      // @Override
      public final Class getEnumClass() {
            return ItemStatus.class;

       * Gets all defined ItemStatus.
       * @return the enum object List
       * @see org.apache.commons.lang.enums.Enum#getEnumList(Class)
      public static List getEnumList() {
            return getEnumList(ItemStatus.class);

       public String getDisplayName() {
		return displayName;

      // --------------------------------------------------- Private Methods

       * Adds the status name to a Set of status names.
      private void buildStatusSet() {
            if (statuses == null) {
                  statuses = new TreeSet();

And I got the ClassCastExcetion in the private "buildStatusSet()-Method if I try to add the
status to the TreeSet. The TreeSet calls the compareTo-Method of the Enum. In Commons Lang
2.2 this method was changed with an additional comparison of the classes.
In my constructor I added a System.out.println of the instantiated classes and got the following
output for the classnames:


The compareTo-Method now tries to compare ItemStatus$1 with ItemStatus$2 and says to me, that
my ItemStatus-Enums are different classes.

I saw in JIRA there are some other issues in ValuedEnum.compareTo(). Is there a bug in the
Enum.compareTo() implementation which got changed in Lang 2.2?

Thanks in advance for any help or comment on this issue.


To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message