所以,我最近阅读this post,我想做同样的事情。
我并不真正关心“丑陋”等等所以我实现了其中一种方法:
public enum Day {
Monday(1),
Tuesday(2),
Wednesday(3),
Thursday(4),
Friday(5),
Saturday(6),
Sunday(7);
public final int id;
Day(int id) {
this.id = id;
}
public static Day getByID(int id) {
Day d = null;
for (Day dTemp : Day.values())
{
if (id == dTemp)
{
d = dTemp;
break;
}
}
return d;
}
public Day getNext() {
return values()[(ordinal()+1)%values().length];
}
public Day getPrev() {
return values()[(ordinal()-1)%values().length];
}
}
但是,当我这样做时,问题出在if语句中:
if (id == dTemp)
它说它们是不兼容的类型。我该怎么做才能解决它?
答案 0 :(得分:2)
使用if ( id == dTemp.id )
。枚举是类,枚举值是不是整数的对象,因此不能对int
进行转换(既不明确也不隐式)。
或者,请注意枚举具有序数,即其位置的id。在您的示例中,Monday
将具有序数0,Sunday
将具有序数6.您可以通过调用ordinal()
方法来访问序号。
因此,如果id
是一个基础,那么您可以执行以下操作:
public static Day getByID(int id) {
//check id is between 1 and 7, I'll leave that for you
return Day.values()[id - 1];
}
请注意,您可能希望将Day.values()
缓存在私有静态变量中,然后访问该缓存的数组。
顺便问一下,你在问题中提到的字符串在哪里?
答案 1 :(得分:1)
if(id == dTemp.id)
应该工作。
或者尝试使用ordinal()
的{{1}}方法。
public final int ordinal()返回此枚举常量的序号(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。
返回: 这个枚举常数的序数。 See
好吧,我复制了你的代码并进行了相应的测试。
两者
enum
和
if (id == dTemp.ordinal()+1)
工作正常并按预期生产。声明
if(id == dTemp.id)
产生星期一。