2014-03-03 43 views

回答

1

这是交换机是如何构建到Java中的。但是,您可以执行的操作是在将它们放入开关之前将其作为int类型强制转换。

2

Oracle Documentation

一个switch作品与byteshortcharint基本数据类型。

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

+0

以及为什么long不包含在这个列表中? – gstackoverflow

+0

@gstackoverflow:我认为这不是一个有效的问题。 –

+0

只被排除在所有原始list.it是奇怪的 – gstackoverflow

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(); 
+0

这不是'switch'语句。 – AJMansfield

+0

我不明白你的想法 – gstackoverflow

+0

我知道这不是'switch'。但它有时比if/then/else更好,因为它在[constant time](http://en.wikipedia.org/wiki/Time_complexity#Constant_time)中执行。 –

-1

当您使用编程语言时,您被限制为该语言的定义。在这种情况下,在Java switch声明

作品有根据Java语言specification字节,短,char和INT的原始数据类型

+0

只是一个问题 – gstackoverflow

+0

当然想了解downvote一个准确的答案! – ErstwhileIII

+0

,因为你的回答没有帮助。你的回答不是回应我的问题。 – gstackoverflow

0

正如其他人所说,你不能在case语句中使用long(或String等)。如果你真的想用很长的时间,很明显的选择是使用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),而如果/那么/ else将以线性时间O(N)执行。正如你所看到的,这个构造可以与Long,String或任何你喜欢的对象一起使用。

+0

由于Long语言不允许在Java语言中使用switch语句,请告诉我们您正在尝试执行的操作,也许我们可以提供替代方法。 – ErstwhileIII

+0

我正在创建一个基于long的开关构造,它在FFS中不断执行! –

+0

您需要将您的“长”值转换为整数......是否有合理的映射来执行此操作?如果您有一组使用的descrete Long值,则可以使用另一种方法创建HashMap 映射,并在switch语句中使用“int”。 – ErstwhileIII

相关问题