枚举常量使用int类型以外的表达式定义。为何会报错
时间: 2024-10-01 07:06:12 浏览: 50
枚举常量在Java中通常用于创建一组预定义的、有限的值集合。它们定义时必须使用整型数值,因为枚举本质上是特殊的类,其成员默认是静态且final的int类型的值,这个值被称为“ordinal”。如果你想使用非整型表达式定义,比如字符串或其他数据类型,Java编译器会报错,因为它期望的是枚举常量能通过数字索引来唯一标识。
例如,这行代码就会报错:
```java
public enum Color { RED("red"), GREEN(0); // 这里 "RED" 就不是有效的int值
```
正确的做法是使用整数作为基础,然后提供一个toString()方法来获取实际的字符串表示:
```java
public enum Color { RED(0), GREEN(1);
private String name;
Color(int value) {
this.name = this.name().toLowerCase();
}
public String getName() {
return name;
}
}
```
相关问题
c++表达式必须包含整数或枚举类型
在程序设计中,C语言中的表达式必须包含整数或枚举类型。表达式是一组指令或操作符的组合,用于计算出一个值。而C语言要求表达式中的操作数必须是整数或枚举类型。
整数类型是C语言中的一种基本数据类型,可以表示整数值。常见的整数类型有int、short、long等。在表达式中,可以使用整数类型的常量或变量作为操作数进行计算。例如,可以编写一个表达式计算两个整数相加的结果。
枚举类型是C语言中的一种用户自定义的数据类型,用于定义具有一组离散取值的变量。枚举类型的取值由程序员手动指定,并且只能在取值范围内进行操作。在表达式中,可以使用枚举类型的变量作为操作数进行计算。例如,可以编写一个表达式判断枚举类型变量的取值是否满足某个条件。
需要注意的是,C语言中的表达式还可以包含其他的运算符和函数调用等。但无论是运算符还是函数调用,最终的操作数都必须是整数或枚举类型。如果表达式中包含其他类型的操作数,编译器会报错。
总之,C语言中的表达式必须包含整数或枚举类型。这是因为C语言是一种静态类型的语言,其设计初衷是为了能够高效地进行底层的计算和操作。对于其他类型的数据,可以通过类型转换等方式将其转换为整数或枚举类型,然后再进行计算。
在Java代码中通过R.id.your_id获取到对应的整数值,因为资源ID是编译时已知的。已经使用但还是报错不为常量表达式
当你尝试在Java代码中使用`R.id.your_id`来获取资源ID并用作`switch`语句的`case`值时,可能会遇到“不是常量表达式”的错误,这是因为编译器需要静态分析,无法接受运行时才能确定的具体值。
尽管`R.id.your_id`的确是在编译时生成的一个枚举,代表了资源ID,但在编译期间它仍然是一个`int`类型的引用而非具体的数值。为了在`switch`语句中使用,你需要在编译时将其转换为一个常量表达式,比如:
```java
int resourceId = R.id.your_id;
switch (resourceId) {
//...
}
```
或者在运行时使用`Integer.parseInt()`或`Resources.getIdentifier()`将其转换为字符串再处理,但这会增加代码复杂性和运行时开销:
```java
String idStr = String.valueOf(R.id.your_id);
switch (Integer.parseInt(idStr)) {
//...
}
```
然而,上述方法并不是最佳实践,因为在大多数情况下,Java编译器不会允许这种类型的`switch`,除非你知道ID是有限且固定的枚举。如果确实需要动态处理资源ID,可能更适合使用HashMap或反射。
阅读全文
相关推荐
















