gpt4 book ai didi

java - 如何让枚举在实现接口(interface)时使用它们的 compareTo 方法?

转载 作者:行者123 更新时间:2023-11-30 11:05:47 25 4
gpt4 key购买 nike

结构是这样的:

public interface ItemList{ }

public enum ItemList1 implements ItemList {

Apple,
Orange;
}

public enum ItemList2 implements ItemList {

Banana,
Grapes;
}

还有 5 个这样的枚举

要求是将这些枚举用作 Map 中的键,在这些 Map 中我将键设置为:

public Class SomeClass {
private Map<ItemList, OtherObject> objectList;
//other code
}

进入 map 的 ItemList 在运行时决定。我需要使用像 TreeMap 这样的排序 Map 来进行其他操作。因此,显然 TreeMap 无法比较键枚举,因为我已将它们声明为 ItemList 父类(super class)型。

所以,我搜索了其他问题并做了类似的事情,以便枚举可以使用它们的 compareTo 方法:

public interface ItemList<SelfType extends ItemList<SelfType>> extends Comparable<SelfType>{ }

public enum ItemList1 implements ItemList<SelfType> {
//enum values
}

但这并不能解决问题。当我尝试检索将我的枚举作为键的 TreeMap 时,我仍然得到相同的“ClassCastException”。

如果我在这里做错了什么,请提出建议,或者有什么其他方法可以解决这个问题?

编辑:链接到我遵循的解决方案,但它不起作用: How to implement an interface with an enum, where the interface extends Comparable?

编辑 2问题已确定。对不起大家。我的 map 中填充了不同类型的枚举作为键,而所有键都应属于同一类型才能进行排序。

最佳答案

嗯,您已经发现它是 Map 的实际内容,不是导致异常的类的声明,但值得注意的是,使用集合比较这些 enum这比您想象的要容易。

例如TreeMap不关心其声明的泛型类型是否具有可比较的键。如果你有像

这样的类声明
public interface ItemList{ }
public enum ItemList1 implements ItemList { Apple, Orange }
public enum ItemList2 implements ItemList { Banana, Grapes }

你可以简单地把它当作

TreeMap<ItemList,Object> tm=new TreeMap<>();
tm.put(ItemList1.Apple, "A");
tm.put(ItemList1.Orange, "O");
System.out.println(tm.get(ItemList1.Apple)+" is for "+ItemList1.Apple);
tm.clear();
tm.put(ItemList2.Banana, "B");
tm.put(ItemList2.Grapes, "G");
System.out.println(tm.get(ItemList2.Banana)+" is for "+ItemList2.Banana);

没有问题;如果您将 map 声明为 TreeMap<Object,Object>,它甚至可以工作.

请注意,某些方法在通过不指定 Comparator 来请求自然顺序 时需要可比较的类型,例如使用上面的类型声明,

List<Object> list=Arrays.<Object>asList(ItemList1.Orange,ItemList1.Apple,ItemList1.Orange);
Collections.sort(list);

不编译,但是,您可以通过 null 请求自然顺序 轻松绕过它Comparator :

Collections.sort(list, null); // compiles and works

所以没有必要像 ItemList<SelfType extends ItemList<SelfType>> 这样复杂的类型声明。在大多数情况下。

关于java - 如何让枚举在实现接口(interface)时使用它们的 compareTo 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29520673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com