【问题标题】:Java autoboxing int to Long [duplicate]Java自动装箱int到Long [重复]
【发布时间】:2019-03-05 12:42:04
【问题描述】:

为什么 Java 编译器不能直接将 int 转换为 Long

long test = 1; // ok
Long test2 = 2; // does not compile!
Long test3 = 3L; // ok

这尤其令人沮丧,因为(当然)一个人可以做到

long test = 1;    
Long test2 = test;

这是一个深思熟虑的设计选择吗?如果允许这样做会出什么问题?

【问题讨论】:

  • 要使 Long test2 = 2; 工作,需要 2 次隐式转换(intlong 然后 longLong)。你怎么看?
  • @ernest_k 我完全没问题!
  • 更糟糕的是,它编译为:Short test4 = 4;stackoverflow.com/questions/14425606/…
  • @Thilo 更有理由保持一致并允许其扩大。此外,缩短通常是不安全的。

标签: java casting autoboxing


【解决方案1】:

int 是 Java 中的原始数据类型。 long 也是原始数据类型,但 Long 不是原始数据类型。 隐式转换不是这样工作的。您必须明确告诉 Java 转换为 Long 类型的对象。

可以将long 隐式转换为Long,因为它是单个隐式转换。从intLong 将是一步中的两次转换,这是不受支持的。

有关整数后缀语法100L,请参阅JLS 3.1L 将值的类型设置为 long 而不是 int,这是整数类型的默认情况。

【讨论】:

  • 我已经注意到它不受支持,我的问题是为什么。
  • 我解释说这是因为一步中的两次隐式转换无法完成且未指定。
  • 嗯。 Short test4 = 4 也是两次转换,这是允许的。
  • 是的,因为这是一个缩小步骤。
  • 一般来说,Java 禁止在一个步骤中进行两次转换。这就是为什么它不适用于Long的原因。允许它缩小转换范围是一个糟糕的设计决定,我认为这背后没有真正的原因。
猜你喜欢
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多