Java 스위치 문: 상수 표현이 필요하지만 IS 상수입니다.
이 클래스에서 몇 가지 정적 상수를 사용하고 있습니다.
public abstract class Foo {
...
public static final int BAR;
public static final int BAZ;
public static final int BAM;
...
}
그리고 상수에 따라 관련 문자열을 얻을 수 있는 방법을 알고 싶습니다.
public static String lookup(int constant) {
switch (constant) {
case Foo.BAR: return "bar";
case Foo.BAZ: return "baz";
case Foo.BAM: return "bam";
default: return "unknown";
}
}
컴파일 할 때 '아예'가 .constant expression required3개의 케이스 라벨 각각에 오류가 있습니다.
에 이 알 컴파일러가 컴파일 시에 알 수 없는 입니까?Foo.BA_★★★★★★★★★★★★★★★★★★?
컴파일러가 스위치를 컴파일하기 위해 컴파일 시 이 표현을 알아야 한다는 것은 이해하지만 왜 Foo는 그렇지 않은가.BA_ 상수?
필드 초기화 후에 실행되는 코드의 관점에서는 일정하지만, JLS가 요구하는 의미에서는 컴파일 시간 상수는 아닙니다.상수식의1 지정에 대해서는, 제15.28항수식을 참조해 주세요.이는 다음과 같이 "상수 변수"를 정의하는 제4.12.4조 최종 변수를 의미한다.
primitive type 또는 string 타입의 변수를 최종 컴파일 시간 상수식('15.28)으로 초기화합니다.변수가 상수 변수인지 아닌지는 클래스 초기화(1212.4.1), 바이너리 호환성(113.1, 413.4.9) 및 확정 할당(1616)과 관련하여 영향을 미칠 수 있습니다.
이 예에서는 Foo입니다.BA* 변수에는 이니셜라이저가 없으므로 "상수 변수"로 적합하지 않습니다.수정은 간단합니다. Foo를 변경합니다.BA* 변수 선언: 컴파일 시간 상수 식인 이니셜라이저를 사용합니다.
예 시간를 ada(Initializer)로 합니다.final이치노
.enumint상수는 다른 몇 가지 제약사항이 있습니다.
- 다음을 포함해야 합니다.
default가 도, 「」가 있는 라도)case있는enum; enum 스위치에 디폴트가 필요한 이유를 참조하십시오. case.enum" "로은 없습니다. "로 평가됩니다.enum★★★★★★ 。
- 할 수 .1 - 상음음음 음음음 음음음 음음음 음 1 1 1 1 1 1 1 1 1 1 。 a 및 A)를 할 수 .Stringb) 리터럴인 프라이머리만 허용한다(단,null) 및 상수 변수만, c) 하위 표현식으로 괄호 안에 넣을 수 있는 상수 표현식을 허용하고, d) 할당 연산자를 제외하고 연산자를 허용한다.++,--또는instanceof, 및 e) 유형 캐스트를 원시 유형으로 허용하거나String오직.
여기에는 메서드나 람다 호출 형식이 포함되지 않습니다.new,.class..length또는 어레이 서브스크립팅.또한 어레이 값을 사용할 경우,enuma)로 인해 값, 원시 래퍼 유형의 값, 상자 및 상자 해제 기능이 모두 제외됩니다.
값을 상수로 유지했기 때문에 상수식이 필요합니다.시험:
public abstract class Foo {
...
public static final int BAR=0;
public static final int BAZ=1;
public static final int BAM=2;
...
}
Android에서 이 오류가 발생했는데, 해결 방법은 다음과 같습니다.
public static final int TAKE_PICTURE = 1;
대신
public static int TAKE_PICTURE = 1;
왜냐하면 그것들은 컴파일 시간 상수가 아니기 때문입니다.다음의 유효한 코드를 고려합니다.
public static final int BAR = new Random().nextInt();
가치를 알 수 있는 것은BAR실행 시.
다음 예시와 같이 열거형을 사용할 수 있습니다.
public class MainClass {
enum Choice { Choice1, Choice2, Choice3 }
public static void main(String[] args) {
Choice ch = Choice.Choice1;
switch(ch) {
case Choice1:
System.out.println("Choice1 selected");
break;
case Choice2:
System.out.println("Choice2 selected");
break;
case Choice3:
System.out.println("Choice3 selected");
break;
}
}
}
다음 방법을 사용할 것을 권장합니다.
public enum Animal {
DOG("dog"), TIGER("tiger"), LION("lion");
private final String name;
@Override
public String toString() {
return this.name;
}
}
public class DemoSwitchUsage {
private String getAnimal(String name) {
Animal animalName = Animal.valueOf(name);
switch(animalName) {
case DOG:
// write the code required.
break;
case LION:
// Write the code required.
break;
default:
break;
}
}
}
이 답변은 몇 년 전에 나온 것으로 아마 관련이 없을 것입니다만, 만약을 위해서입니다.내가 이 문제에 직면했을 때, 나는 단지 그 문제를 사용했을 뿐이다.if대신 성명switch에러를 해결했습니다.물론 회피책으로 적절한 해결책은 아닐 수 있지만, 제 경우에는 충분했습니다.
편집: 2021.01.21
이 답변은 다소 오해의 소지가 있습니다.이것을 명확히 하고 싶습니다.
- 의 교환
switch가 붙은 성명ifgoto 해결책으로 간주되어서는 안 된다, 두 개념 모두 타당한 이유가 있다.switch그리고.if소프트웨어 개발에도 존재하며 둘 중 하나를 선택할 때 고려해야 할 성능 문제도 있습니다. - 제시된 오류에 대한 해결책을 제시하지만, 내 답변은 문제가 발생하는 이유를 설명하지 않고 문제를 회피하는 방법을 제공합니다.
제 경우, confirm, confirm을if대신 진술은 문제를 해결하기에 충분했다.개발자는 시간을 갖고 이것이 현재 당면한 문제에 대한 올바른 해결책인지 판단해야 합니다.
따라서 이 답변은 제 첫 번째 답변에서 언급한 특정 사례의 회피책으로만 간주되어야 하며, 이 질문에 대한 정답으로 간주해서는 안 됩니다.
스위치 케이스에서 이 값을 사용하는 경우 스위치에 삽입하기 전에 열거 유형을 가져와야 합니다.예:
SomeEnum someEnum = SomeEnum.values() [1];
switch (someEnum) {
case GRAPES:
case BANANA: ...
열거형은 다음과 같습니다.
public enum SomeEnum {
GRAPES("Grapes", 0),
BANANA("Banana", 1),
private String typeName;
private int typeId;
SomeEnum(String typeName, int typeId){
this.typeName = typeName;
this.typeId = typeId;
}
}
제 경우, 이 예외는 다음과 같습니다.
switch (tipoWebServ) {
case VariablesKmDialog.OBTENER_KM:
resultObtenerKm(result);
break;
case var.MODIFICAR_KM:
resultModificarKm(result);
break;
}
, 나는 .var.MODIFICAR_KM: 이 은 써야겠다.VariablesKmDialog.OBTENER_KM이치노
다음 코드는 자체 설명이므로 스위치 케이스와 함께 열거형을 사용할 수 있습니다.
/**
*
*/
enum ClassNames {
STRING(String.class, String.class.getSimpleName()),
BOOLEAN(Boolean.class, Boolean.class.getSimpleName()),
INTEGER(Integer.class, Integer.class.getSimpleName()),
LONG(Long.class, Long.class.getSimpleName());
private Class typeName;
private String simpleName;
ClassNames(Class typeName, String simpleName){
this.typeName = typeName;
this.simpleName = simpleName;
}
}
열거형 클래스 값을 기반으로 매핑할 수 있습니다.
switch (ClassNames.valueOf(clazz.getSimpleName())) {
case STRING:
String castValue = (String) keyValue;
break;
case BOOLEAN:
break;
case Integer:
break;
case LONG:
break;
default:
isValid = false;
}
도움이 되었으면 좋겠다:)
스위치 변수에서도 다음과 같은 오류가 발생할 수 있습니다.
switch(view.getTag()) {//which is an Object type
case 0://will give compiler error that says Constant expression required
//...
}
해결하려면 변수를 int(이 경우)로 캐스팅해야 합니다.그래서:
switch((int)view.getTag()) {//will be int
case 0: //No Error
//...
}
Android에서 다음과 같은 오류가 발생했습니다.
roleSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch (parent.getItemAtPosition(position)) {
case ADMIN_CONSTANT: //Threw the error
}
상수를 선언함에도 불구하고:
public static final String ADMIN_CONSTANT= "Admin";
코드를 다음과 같이 변경하여 문제를 해결했습니다.
roleSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItem = String.valueOf(parent.getItemAtPosition(position));
switch (selectedItem) {
case ADMIN_CONSTANT:
}
int와 Integer(이유는 알 수 없습니다)에 문제가 있습니다.int를 문자열로 변경하면 동작합니다.
public abstract class Foo {
...
public static final String BAR;
public static final String BAZ;
public static final String BAM;
...
}
public static String lookup(String constant) {
switch (constant) {
case Foo.BAR: return "bar";
case Foo.BAZ: return "baz";
case Foo.BAM: return "bam";
default: return "unknown";
}
}
enum 사용을 권장합니다.
이것 좀 봐.
public enum Foo
{
BAR("bar"),
BAZ("baz"),
BAM("bam");
private final String description;
private Foo(String description)
{
this.description = description;
}
public String getDescription()
{
return description;
}
}
그 후 다음과 같이 사용할 수 있습니다.
System.out.println(Foo.BAR.getDescription());
언급URL : https://stackoverflow.com/questions/3827393/java-switch-statement-constant-expression-required-but-it-is-constant
'programing' 카테고리의 다른 글
| PHP에서 $array[] = $value와 array_sarray, $value 중 어느 쪽이 더 빠릅니까? (0) | 2022.10.27 |
|---|---|
| JSON.stringify의 역방향? (0) | 2022.10.27 |
| JVM이 JIT 컴파일 코드를 캐시하지 않는 이유는 무엇입니까? (0) | 2022.10.27 |
| MySQL의 로드 데이터 파일에 대한 액세스가 거부되었습니다. (0) | 2022.10.08 |
| yield()의 주요 용도는 무엇이며 join() 및 interrupt()와는 어떻게 다릅니까? (0) | 2022.10.08 |