为什么我不能使用long原语作为switch()部分的表达式?

时间:2014-03-03 16:01:25

标签: java switch-statement

我注意到我不能使用long作为switch()部分的表达。

我不明白为什么。

这个原始人比其他人更糟?

long出了什么问题?

5 个答案:

答案 0 :(得分:2)

来自Oracle Documentation

  

switch适用于byteshortcharint原始数据类型。

您无法启用long的原因是没有必要。为了有意义地打开long,您需要为要切换到的每个值添加case语句。 (支持int的唯一原因是因为这是默认的整数类型;即使对于int来说也是一种浪费。)

答案 1 :(得分:1)

这是如何将交换机构建到Java中的。但是,你可以做的是在将它们放入切换之前将长值转换为int类型。

答案 2 :(得分:1)

有时,地图可以用作一种切换。例如:

Map<Long, Runnable> map = new HashMap<Long, Runnable>();
map.put(1L, new Runnable() { ... });
map.put(2L, new Runnable() { ... });
...
map.put(Long.MAX_VALUE, new Runnable() { ... });

map.get(someLongValue).run();

答案 3 :(得分:0)

正如其他人所说,你不能在case语句中使用long(或String等)。如果你真的想要使用long,那么显而易见的选择是使用if / then / else。

例如:

if (someValue == 1L) { 
    println("one"); 
} else if (someValue == 2L) { 
    println("two"); 
} ...
} else if (someValue == 1000L) { 
    println("thousand"); 
}

但是如果你有很多选择,那么由于你需要评估每个条件,这将表现得非常糟糕。我在其他答案中建议的是使用地图

Map<Long, Runnable> map = new HashMap<Long, Runnable>();
map.put(1L, new Runnable() {
    public void run() { println("one"); }
});
map.put(2L, new Runnable() { ... });
...
map.put(1000L, new Runnable() { ... });

然后你可以使用

map.get(someValue).run();

地图版本将以恒定时间O(1)执行,而if / then / else将以线性时间O(N)执行。如您所见,此构造可以与Long,String或您喜欢的任何对象一起使用。

答案 4 :(得分:-1)

使用编程语言时,您只能使用该语言的定义。在这种情况下,Java switch语句

  

使用byte,short,char和int原始数据类型

根据Java语言specification