Java casting order

Suppose I have the following settings

class A {
    B foo();
}

class C extends B {

}

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

We know that A. foo () returns type B

When I do (c) A. foo (), right

>How about converting a class to C and then trying to call foo()? > Call foo () and convert the result to class C?

I find it hard to be sure, and I've always just added extra parentheses on the cautious side (it's not a bad idea, readability, but now I'm curious)

This is a specific reference to objectinputstream Readobject(), although I can't see how to change the behavior

Solution

(C) A. foo () is equivalent to (c) (A. foo ()), that is, the #2

To get #1, you must write ((c) a) foo().

The Java language specification does not specify operator precedence in a nice, easy - to - read summary

Introduction to java written by Sedgewick and Wayne appendix a comprehensive table with operator priority

Appendix B of the Java programming language has an operator precedence table, but it is not as complete as Sedgewick

A careful examination of the grammar in the Java language specification can determine the relative priority of the relevant transformation and method call expressions:

Expression:
        Expression1 [AssignmentOperator Expression1]]

Expression1:
        Expression2 [Expression1Rest]

Expression1Rest:
        ?   Expression   :   Expression1

Expression2 :
        Expression3 [Expression2Rest]

Expression2Rest:
        {InfixOp Expression3}
        Expression3 instanceof Type

Expression3:
        PrefixOp Expression3
        (   Expression | Type   )   Expression3
        Primary {Selector} {PostfixOp}

Primary:
        ParExpression
        NonWildcardTypeArguments (ExplicitGenericInvocationSuffix | this Arguments)
        this [Arguments]
        super SuperSuffix
        Literal
        new Creator
        Identifier { . Identifier }[ IdentifierSuffix]
        BasicType {[]} .class
        void.class

Make relevant in bold We can see that a conversion expression matches the production expression3: (expression | type) expression3 The method call matches the production expression3: primary {selector} {postfixop} through the production primary: identifier { Identifier} [identifiersuffix] Putting them together, we see that the method call expression will be treated as a unit (an expression3) operated by the actor

Well, the priority map is easier to follow...)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>