【发布时间】:2020-01-30 21:53:05
【问题描述】:
在 Java 中是否可以使用对象而不是原始类型来使用 switch-case 语句?
我有一个场景,我有很多 2d 位置 (x,y),我希望它们每个在被触发后表现不同。
例如,我想:
Pos pos = getNextPos();
switch (pos) {
case new Pos(1, 2):
// do something
break;
case new Pos(9, 7):
// do something else...
break;
etc...
}
或许
Pos pos = getNextPos();
Pos[] listOfPos = getListOfPos();
switch (pos) {
case listOfPos[0]:
// do something
break;
case listOfPos[1]:
// do something else...
break;
etc...
}
我还在 Pos 类中实现了 .equals() 方法,仅当 x 和 y 都等于另一个对象时才返回 true。
Pos 类(带有自动生成的 equals 和 hashCode):
public class Pos {
public int x;
public int y;
public Pos(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pos pos = (Pos) o;
return x == pos.x && y == pos.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
我已经尝试了所有这些,但是在编译时我得到“不兼容的类型:Pos 无法转换为 int”。
【问题讨论】:
-
你不能那样做。来自tutorial page:“开关适用于 byte、short、char 和 int 原始数据类型。它也适用于枚举类型(在 Enum Types 中讨论)、String 类和一些包装某些原始数据的特殊类类型:字符、字节、短整数和整数(在数字和字符串中讨论)。”有关 Java 中开关的更多讨论,请参阅 this question。
标签: java