问题
I have noticed that there are two ways to cast objects (the difference is the placement of the outer parenthesis):
1. SimpleType simpleType = ((SimpleType) (property.getType()));
2. SimpleType simpleType = ((SimpleType) property).getType();
Are they doing the same thing ?
回答1:
Are they doing the same thing ?
No they are not.
- The first one is casting your value returned from
property.getType()
toSimpleType
. (Invocation is done before Casting) - The second one is first casting your
property
toSimpleType
and then invoking thegetType()
method on it. (Casting is done before Invocation).
You can also understand it from the precedence of parenthesis. Since it has the highest precedence, it will be evaluated first.
First Case: -
So, in ((SimpleType) (property.getType()));
: -
(property.getType())
is evaluated first, then the casting is performed. In fact you don't really need a parenthesis around that. (property
binds tighter to the dot (.)
operator than the cast
operator). So, invocation will always be done before casting. Unless you force it to reverse as in the below case: -
Second Case : -
In ((SimpleType) property).getType()
: -
((SimpleType) property)
is evaluated first, then the invocation is done. As, now you have enclosed property
inside the brackets, due to which it binds tighter to the cast
operator, due to higher precedence enforced by parenthesis.
回答2:
They are doing two totally unrelated things: first is dowcasting the result of getType()
and the second is downcasting the property
variable. The first one looks like the one you need, given the type of the left-hand side. Note that in the first example you have extra parentheses, this would be enough, and is how this is idiomatically written:
SimpleType simpleType = (SimpleType) property.getType();
回答3:
They are not the same.
- The first casts the result of
getType
toSimpleType
. - The second casts
property
toSimpleType
and callsgetType
on it, yet the result ofgetType
is not casted toSimpleType
.
回答4:
No they are not doing the same thing.
SimpleType simpleTypee = ((SimpleType) (property.getType()));
First the property.getType()
will be called and the object returned by property.getType()
will be casted to SimpleType
and in the second case
SimpleType simpletype = ((SimpleType) property).getType();
first the object property
will be casted to SimpleType
and then getType()
will be invoked on that newly casted object
回答5:
They are doing different things as detailed in the other answers. You can also cast by doing this
SimpleType.class.cast(property.getType());
SimpleType.class.cast(property).getType();
Depending on what you actaully want to cast. Either property or the result of getType(). I prefer this syntax as it is more explicit and easier on the eye...
回答6:
They are entirely doing diffrent things. they are not same at all.
1. SimpleType simpleTypee = ((SimpleType) (property.getType()));
This first invokes getType of property and then casts the returned Object to SimpleType
2. SimpleType simpletype = ((SimpleType) property).getType();
This first casts the property to SimpleType and then invokes getType on the SimpleType
来源:https://stackoverflow.com/questions/13581353/issue-about-casting-object-brackets