Java编码规范:为什么需要在强制类型转换后加上空格?

11

不知道是否有人了解Java编码规范中这个特定项背后的原理。根据Java编码规范,在进行强制类型转换时需要在括号后面加一个空格,例如:

Object myObj = (Object) someThing;
                       ^

这和C语言中的类型转换语法是一致的,永远不会在其后面加上空格:

Object myObj = (Object)someThing;
                       ^

我认为这是因为 cast 是一元运算符。在那里放一个空格就像做这样的事情:

int x = ++ y;
while (0 < ++ x) { ... }

......这不是你通常看到的东西:

int x = ++y;
while (0 < ++x) { ... }

这似乎是Java独有的,所以如果有人有任何见解,我很想听听。


1
Java不是C语言,因此任何比较都是无意义的,这就像问为什么草莓的种子在外面而其他水果的种子在里面一样。这是等价谬误;Java语法看起来像C语言,因此它应该与C语言完全相同,这是错误的。 - user177800
7
除了这种情况下是一个“人”做出的决定,这意味着有一些理由。只是好奇是否有原因,还是完全是因为“Java不是C”而任意决定的。 - Droj
1
对于编码规范,Java的建议是以此为结尾,对话就应该结束了。不幸的是,这就是全部。 - CubeJockey
嗯,在谈到Java的语法非常基于C时,提及C是合理的。但是,最终还是要问编写编码规范的人,或者尝试找到他们在做出决定时的一些理由的文档。 - childofsoong
很可能是因为有人使用自动格式化代码的IDE学习编程,然后习惯了这种格式。 - James
断言“它与C语言中的强制转换具有相同的语法,这些强制转换从未在它们之后留有空格”是完全错误的。C/C++不关心空格,就像Java一样。强制转换使用空格没有任何问题,实际上,例如GNU编码标准要求使用空格。此外,“除了在这种情况下是一个人做出了决定”也没有意义:即使语言的语法也来自做出决策的人。 - akim
3个回答

4

Java语言规范“表达式”中,强制类型转换表达式不属于“15.15一元运算符”,而是有自己的小标题“15.16强制类型转换表达式”。它主要不被称为强制类型转换运算符,而是强制类型转换表达式,规范说“括号和它们包含的类型有时被称为强制类型转换运算符。”


1
真的很有趣。谢谢你提供这个信息。有趣的是,在该部分中它仍然被称为“转换运算符”。 - Droj

4

我的个人理由:

  1. In the context of method-call expressions, the argument list binds stronger than a cast, therefore it makes sense to write

    (foo) method(bar)
    

    instead of

    (foo)method(bar)
    

    given the syntactical similarity of both sides.

  1. There are other contexts where not having a space would arguably look weird:

    (int)-(a * b)
    

    This is actually more relevant in C, where due to typedefs you may not be able to tell immediately whether the left-hand side is a cast.

  2. Casts first and foremost operate on the type of the expression, and on the value only as a side effect of the type conversion, if at all. In that sense casts operate on a higher level than regular unary operators. It therefore seems appropriate to indicate that fact by setting them off from the expression they operate on.


3

你提到的这篇文章是1997年写的,给C语言编码约定(可能是某个项目或公司的)快速翻译成Java。据此内容,许多构造方式被认为是“不建议使用”,实际上在Java中是被禁止的语法。

在Java程序中,有一些编程惯例是普遍存在的,特别是涉及类和接口命名(驼峰式命名)、方法命名(使用动词的驼峰式命名)、变量命名(小写字母开头的驼峰式命名)和常量命名(大写字母和下划线命名)。但除此之外,大多数项目都会定义自己的约定,比如括号和空格放置的位置、缩进量、方法之间应该有多少空行等等。在一个项目中保持一致性,但在其他情况下,使用您(和其他在项目上工作的人)感觉最舒适的约定。如果其他人不喜欢您的约定,他们可以使用众多格式化工具将代码自动转换为自己喜欢的样式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接