当前位置: 首页 > 知识库问答 >
问题:

Java开关case语句返回不同类型的值(不同的数据类型),并分配给相同的变量类型var

齐凯康
2023-03-14

以下是我的代码片段:

Scanner sc = new Scanner(System.in);
int input = sc.nextInt();

var output = switch (input){
  case 1 -> "one";
  case 2 -> '2';
  case 3 -> 3.14;
  default -> 10;
};

System.out.println(output);

现在,如果我输入1作为输入,它会打印“1”,对于2它会打印“2”,对于3它会打印3.14,对于其余的它会打印10。

这是否意味着输出的数据类型是根据返回类型在运行时决定的?

共有3个答案

连昊天
2023-03-14

输出的类型在编译时确定为Serializable,因为它是所有结果最接近的公共祖先。

这包括:

Serializable x = output;

分配给变量的对象在运行时确定,是字符串、字符、双精度或整数。

苏富
2023-03-14

不,输出变量始终在编译时确定,如下所述:

使用var,Java编译器在编译时使用从变量初始值设定项获得的类型信息推断变量的类型。然后将推断类型用作变量的静态类型。

在这种特殊情况下,它是一个实现可串行化、可比较和常量的类,正如您在现代ide中看到的那样

请注意,这不是通用对象。事实上,您不能将输出变量重新分配给像ArrayList这样的通用对象。

output = new ArrayList<String>());    // It doesn't compile

而您可以重新分配给任何可比较的Constable和Serializable,例如长

output = 10L;    // It compiles!
嵇财
2023-03-14

输出被推断为所有这些类型中最接近的公共超类。没有更具体的共同点,因此变量的类型被推断为所有扩展的对象。幸运的是系统。出来println接受这一点(因为它可以使用任何可能的参数)。

'2'自动装箱为字符,3.14为双精度,10为整数。

So<代码>输出。getClass()将返回四个不同的内容之一。

 类似资料:
  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 我想基于泛型值返回不同的类型。例如: 但我有一个错误: 类型字符串[]不能分配给类型T扩展Base?String[]:字符串

  • (Spring的@CachePut注释是否适用于void返回类型?) 我遇到了同样的问题 因为这个问题已经存在很长时间了,我不知道是否有解决办法 创建缓存: 使用@CachePut更新此缓存 输出: 我搜索了几天信息,但没有找到答案 除了使用@CacheEvict(cacheNames=userCache,allEntry=true) 有没有办法用@Cacheable和@CachePut解决? 非

  • 问题内容: 。 将返回String和int值。因此,我从这些返回值中得出了以下解决方案。 建立课程通话 并进行如下更改。 现在我的问题是,有没有更简单的方法来实现这一目标? 问题答案: 最后,我认为我的方法会更好,因为当返回类型的数量增加时,这种实现会以最佳方式实现。