为什么 instanceof 是关键字?

Why is instanceof a keyword?

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

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

关于基本制作:

RelationalExpression:
  ...
  RelationalExpression instanceof ReferenceType

没有 RelationalExpression Identifier ReferenceType 形式的表达式,因为将单个 Identifier 附加到任何 Expression 是永远无效的,并且不能通过添加来扩展 ReferenceType前面一个Identifier

我能想到为什么 instanceof 必须 是关键字的唯一其他原因是如果有一些其他产品包含 Identifier 可以分解成表达式的实例。也就是说,如果我们允许将 instanceof 作为 Identifier,则可能存在不明确的产生式。但是,我似乎找不到任何东西,因为 Identifier 几乎总是通过一个点与其周围的标记分开(或者可以通过以下 lparen 识别为 MethodName)。

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

That question is different, it's asking why "instanceof" isn't a method, I'm asking whether there are reasons syntactically why

你说得有道理,它可能是 Object 上的一个方法,或者我们有

if (myClass.class.isInstance(obj))

这比较麻烦,但是我想说 instanceof 的链条不被认为是最佳实践,让它变得更难一点可能不是一个坏主意。

值得注意的是,Java 的早期版本并没有像现在这样使用内部函数,而且使用方法的效率远低于原生关键字,尽管我不相信今天一定是这样。

Is instanceof a keyword simply out of tradition, rather than necessity?

恕我直言,关键字 were/are 被认为是使具有特殊含义的词突出显示具有且仅具有特殊用途的良好做法。

Could new relational operators be introduced in future Java versions, with tokens that collide with identifiers?

是的,添加 valvar 的建议之一是它们是特殊类型,而不是关键字,以避免与使用它们作为变量名的代码发生冲突。

如果有选择,一种新的语言会产生这些关键字,并且它们可能只是为了向后兼容才可能是其他明智的。或者它被认为使用 final 而不是 valtransient 而不是 var.

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

相比之下,他们禁止使 _ 成为 lambda 变量,以避免与其他具有特殊含义的语言混淆,并且他们警告说使用 _ 作为变量可能是在未来的版本中删除。