当前位置: 首页 > 面试题库 >

Java转换顺序

姬天逸
2023-03-14
问题内容

假设我有以下设置

class A {
    B foo();
}

class C extends B {

}

// later
A a = new A();
C theFoo = (C)a.foo();

我们知道a.foo()返回类型B。

当我做(C)a.foo()的时候

  1. 投射a输入C然后尝试调用foo()吗?
  2. 调用foo()a铸造的结果类型C

我发现很难确定,而且总是在谨慎的情况下打上额外的括号(对于可读性来说,这不是一个坏主意,但现在我很好奇)

ObjectInputStream.readObject()尽管我看不到这将如何改变行为,但具体参考了。


问题答案:

(C)a.foo()等价于(C)(a.foo()),即问题中的#2。

要获得#1,您必须编写((C)a).foo()

Java语言规范没有在易于理解的摘要中指定运算符优先级。

Sedgewick和Wayne撰写的
Java编程简介 附录A中有一张完整的运算符优先级表。

Java编程语言的附录B
有一个运算符优先级表,但它不如Sedgewick的完整。

仔细检查Java语言规范中的语法可以确定所涉及的强制转换和方法调用表达式的相对优先级:

**表达式** :
         **Expression1** [AssignmentOperator表达式1]

表达式1:
        **Expression2** [Expression1Rest]

Expression1Rest:
        ?表达式:Expression1

表达式2:
        **Expression3** [Expression2Rest]

Expression2Rest:
        {InfixOp Expression3}
        Expression3 instanceof类型

表达式3:
        PrefixOp表达式3
        **(表达式|类型)Expression3**
        **Primary** {选择器} {PostfixOp}

主:
        ParExpression
        NonWildcardTypeArguments(ExplicitGenericInvocationSuffix |此参数)
        这个[参数]
        超级后缀
        文字
        新造物主
        **标识符{。 标识符} [IdentifierSuffix]**
        BasicType {[]} .class
        无效类

相关作品以粗体显示。我们可以看到强制转换表达式与生产匹配Expression3 : (Expression|Type) Expression3。方法调用通过生产匹配Expression3 : Primary {Selector} {PostfixOp}生产Primary: Identifier {. Identifier }[IdentifierSuffix]。综上所述,我们看到方法调用表达式将被视为强制转换执行的单元(an Expression3)。

嗯,优先级图表更容易遵循…;)



 类似资料:
  • 我正在尝试用在3个不同的(单击)之间切换,下面是我的代码, 方法是从另一个SO帖子引用的。 现在单击窗格3->转换将首先显示,然后显示。 现在单击窗格2->过渡将显示,上面2点中提到的问题不再出现。 为什么转换显示,然后在第1和第2点显示实际的窗格?是不透明度设置的原因吗?

  • 我有一个Web服务,我想检索树的元素到根节点。我有一个网络流量接口,它在每次调用时返回一个单声道: 让我们假设有一棵树 我想创建以下方法: 这将给我在getNodeChain(5)上一个通量,节点为5,3和1,然后完成。 不幸的是,我不太明白如何按顺序组合Monos,但不阻止它们。使用,我想我需要在每个mono上阻塞,以检查它是否有下一个元素。我发现的其他方法似乎只结合了固定数量的mono,但不是

  • 问题内容: 如果我有一行这样的代码 和…一样吗 要么 ? 问题答案: 这应该使事情更清晰。简单地说,投优先除法运算,所以这将 是同样的事情 给输出相同 编辑: 正如knoight所指出的,这在技术上与没有括号的操作不一样,因为它们也具有优先权。但是,出于本示例的目的,它将提供相同的结果,并且对于所有意图和目的都是等效的。

  • 问题内容: 我正在使用http://www.json.org/java/index.html此处提供的JSON库将必须转换的JSON字符串转换为CSV。但是我有一个问题是,转换后键的顺序丢失了。 这是转换代码: 结果如下: 虽然我期望保持键的顺序: 有什么办法可以使用此库获得此结果吗?如果不是,是否有其他库可以提供保持键顺序在结果中的功能? 问题答案: 解决了。 我使用了https://code.

  • 正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。 InputStreamReader 用于将字节输入流转换为字符输入流,其中 OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可

  • 我有一个SpringLayout需要转换。 基本上,当您创建SpringLayout时,它会按列填充面板,因此如果您有 结果是一个如下所示的表: 然而,我想要 有人知道怎么做吗?