为什么是关键字的instanceof?

时间:2016-04-02 17:28:27

标签: java jls

如果Java允许" instanceof"作为变量(以及字段,类型名称,包名称)的名称,乍一看,该语言仍将保持明确。

在Java中可能出现Identifier的大部分或全部作品中,都有上下文提示可以防止与二元运算符混淆。

关于基本生产:

RelationalExpression:
  ...
  RelationalExpression instanceof ReferenceType

表单RelationalExpression Identifier ReferenceType没有表达式,因为向任何Identifier添加单个Expression永远无效,并且可以通过添加{{{}}}来扩展ReferenceType {1}}在前面。

我能想到为什么必须成为关键字的唯一原因是,如果有一些其他的包含Identifier的产品可以分解为一个instanceof表达式。也就是说,如果我们允许instanceof为Identifier,则可能会产生含糊不清的作品。但是,我似乎无法找到任何内容,因为Identifier几乎总是通过一个点与其周围的标记分开(或者通过后续的lparen可以识别为Identifier)。

关键字的实例是否仅仅是出于传统而非必要性?是否可以在未来的Java版本中引入新的关系运算符,其标记与标识符冲突? (例如,是否可以引入假设的"相关的"运算符,而不会使其成为关键字,这会破坏现有代码?)

1 个答案:

答案 0 :(得分:2)

  

这个问题不同,它问为什么" instanceof"不是一种方法,我在询问是否存在语法上的原因

你有一个观点,它可能是Object上的方法,或者我们有

if (myClass.class.isInstance(obj))

这更麻烦,但是我会说instanceof的链条不被认为是最佳做法,并且使它变得更难有点可能并不是一个坏主意。

值得注意的是,早期版本的Java并没有像现在这样使用内在函数,并且使用某种方法的效率远远低于本机关键字,但我不相信必须在今天成真。

  

关键字的实例仅仅是出于传统而非必要性吗?

恕我直言关键词被认为是一种良好的做法,可以使具有特殊含义的词语具有特殊目的,并且只有特殊用途。

  

在未来的Java版本中是否会引入新的关系运算符,其标记会与标识符冲突?

是的,添加valvar的提议之一是它们是特殊类型,而不是关键字,以避免与将它们用于变量名称的代码冲突。

鉴于选择,一种新语言会生成这些关键字,而且只是为了向后兼容,它们可能是另一种选择。或者,我们考虑使用final而不是valtransient而不是var

就我个人而言,我认为他们应该添加其他语言如何保持一致性,否则你会让每个新的Java开发人员都提出基本的问题,例如How do I compare strings in Java?他们所做的事情是有道理的,但它让每个新开发者都感到困惑。

相比之下,他们禁止将_变成一个lambda变量,以避免与其他具有特殊含义的语言混淆,并且他们会警告如何使用_作为变量将其删除。未来的版本。