About Question enthuware.ocajp.i.v7.2.1328 :

Help and support on OCA OCP Java Programmer Certification Questions
1Z0-808, 1Z0-809, 1Z0-815, 1Z0-816, 1Z0-817

Moderator: admin

seanthemill
Posts: 2
Joined: Tue Feb 04, 2014 4:30 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by seanthemill »

Thanks for the reply. I think I have it figured: my confusion was arising because of the fact that given the assignment

Code: Select all

 A a = (B)new A(); // where B extends from A
the type on the left hand side was an A; however this has nothing to do with the cause of the ClassCastException at runtime. Quite simply, a B reference can never point at an object of type A (and that is what the right hand side of the assignment was trying to create).

Given that is the case, the following also holds true:

Code: Select all

A a = (B)new B();   // no issues at compile time or runtime
because a reference of type A can point at any object of type B (because B is-an A via inheritance).

Is that accurate?

Regards,
Seán.

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

Yes, that is correct.
If you like our products and services, please help us by posting your review here.

iamslrr
Posts: 6
Joined: Sun Dec 20, 2015 1:23 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by iamslrr »

Consider the following classes :

interface I{
void iMsg();
}

class A implements I{
void iMsg() { }
void aMethod() { }
}

class B extends A {
void bMethod() { }
}

class C extends B{
void cMethod() { }
}


And the following declarations:
A a = new A();
B b = new B();
a = (B)(I)b;
a.bMethod();


Why does a.bMethod cause a compiler error:
Test4.java:35: error: cannot find symbol
a.bMethod();
^
symbol: method bMethod()
location: variable a of type A


After the cast a instanceof B is true.

iamslrr
Posts: 6
Joined: Sun Dec 20, 2015 1:23 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by iamslrr »

Ahhh...
Nevermind!

AristPhil
Posts: 4
Joined: Wed Jan 06, 2016 5:38 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by AristPhil »

I've summarized my understanding of this multiple casting question here: http://www.coderanch.com/forums/posts/l ... 31#3066425
I'd appreciate if somebody interested and competent would find the time to verify, if my understanding is correct. Many thanks!

Sergey
Posts: 39
Joined: Sat Jul 29, 2017 1:04 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by Sergey »

Code: Select all

interface I{}
class A implements I{}
class B extends A {}
class C extends B{}

public  class TestClass {
    public static void main(String[] args){
        A a = new A();
        B b = new B();
        
        
        a=b;
        //b=(B)(I)a;
        b=a; // if "a" is a "b" now, why this line of code is wrong?
   }
 }
if "a" is a "b" now, why this line of code is wrong?

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

Your question indicates several misconceptions.
1. It is incorrect to say that "a" is a "b" because "b" is reference variable. You can say "a" points to an object of class B.
2. When you cast a reference of one class to another class, you don't change the actual type of the object that is pointed to by the reference. So when you cast a to B ( i.e. by doing (B) a), you don't convert the object pointed to by the variable a into an object of class B. You merely tell the compiler that a will point to an object of class B at run time.

Thus, at run time, a really has to point to an object of class B for (B) a to succeed at runtime.

I suggest you to read this topic thoroughly from a good book to get your basics right before attempting mock exams.

HTH,
Paul.
If you like our products and services, please help us by posting your review here.

st.lisker
Posts: 22
Joined: Sat Jun 30, 2018 6:11 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by st.lisker »

Hello. Is this some difference between 1 and 2 ? :
A a = (B)(I) b; //1
A a = (B) b: //2

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

No, practically, there is no difference.
If you like our products and services, please help us by posting your review here.

st.lisker
Posts: 22
Joined: Sat Jun 30, 2018 6:11 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by st.lisker »

Ok, thank you.

__JJ__
Posts: 125
Joined: Thu Jul 05, 2018 6:44 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by __JJ__ »

This one tripped me up. I'm glad it did because now it's cleared up an obvious misunderstanding that I had.
It seems tricky but actually, if you think about it, it isn't.
Just remember, if A implements I, an A is an I but an I isn't an A.
To reinforce the point, millions of classes implement Serializable; but that doesn't mean that just because X implements Serializable, any Serializable reference can be assigned to a reference variable of type X.

What makes it deceptive is that when you see
a = (I) b;
you know that A is an I, so you think, surely an I can be assigne to variable a. But the compiler just knows that at that point there is something that is an I. It is only known to be an I; it could be any one of millions of classes that is implements I. So you can't just assign it to a variable of type A without explicitly casting it.

tosidis
Posts: 3
Joined: Fri Oct 26, 2018 4:45 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by tosidis »

Hello, I think that this a = (B)(A)b; would also compile and run , even if a is declared like this I a = new A();

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

tosidis wrote:
Sun Nov 25, 2018 6:26 am
Hello, I think that this a = (B)(A)b; would also compile and run , even if a is declared like this I a = new A();
Correct.
If you like our products and services, please help us by posting your review here.

jimmy21
Posts: 3
Joined: Sun Dec 23, 2018 6:38 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by jimmy21 »

Are there any differences betwen:

Code: Select all

 a = (B)(I)b; 
  a = (B)b;
  a = b;

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

(I) in (B)(I) is redundant so,
a = (B)(I)b; and a = (B)b; are same.

a = b; is obviously not the same because there is no cast. It is valid here only because type of b is-a A. It may not always work.
If you like our products and services, please help us by posting your review here.

jimmy21
Posts: 3
Joined: Sun Dec 23, 2018 6:38 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by jimmy21 »

Thank you.

noeloo
Posts: 61
Joined: Sat Feb 15, 2020 8:56 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by noeloo »

"A reference of type I can be cast to any class at compile time."

Are you sure about that?
I tried it and I get Inconvertible types compilation error.

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

Please post the exact code that u tried. Also, please go through the above discussion.
If you like our products and services, please help us by posting your review here.

noeloo
Posts: 61
Joined: Sat Feb 15, 2020 8:56 am
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by noeloo »

Code: Select all

public class Test {
    public static void main(String[] args) {
        I i = null;
        Integer s = (Integer) i;
    }
}

interface I{}
I went through the discussion cursorily - I doesn't seem to be about the same thing. But if the answer is there, I could read it all and try to understand, however I guess then I'll have questions to the discussion itself.

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

Ok, I see the issue. The phrase "any class" is not completely correct. It should say "any class except a class that is final and does not implement I". The principle behind it is that a variable of one class can, at runtime, point to an object of a subclass that implements I. Therefore, the compiler has no option but to accept the cast. Of course, it fails for Integer because it is final and the compiler knows that it is not possible for a variable of type Integer to point to an object of a class that implements I.
If you like our products and services, please help us by posting your review here.

Dreamweaver
Posts: 32
Joined: Mon Dec 29, 2014 4:14 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by Dreamweaver »

I dissected the situation a bit to better understand and I came to the next summary:

interface I { }
class A implements I { }
class B extends A { }
class C extends B { }

public class CastTwice {
public static void main(String[] args) {
A a = new A();
B b = new B();

//a = (B)(I)b; is the same with:

I x = (I) b; // x is type I and is pointing to a B object //Possible because B is-a I
a = (B) x; // x is-a B and so, x is-a a //Possible because B is-a A


casting3.jpg
casting3.jpg (9.2 KiB) Viewed 1970 times
Is that correct?

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

At the end of the statement, a should be pointing to the B object.
If you like our products and services, please help us by posting your review here.

Dreamweaver
Posts: 32
Joined: Mon Dec 29, 2014 4:14 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by Dreamweaver »

Thank you very much, I updated the image:
casting6.jpg
casting6.jpg (10.27 KiB) Viewed 1967 times

admin
Site Admin
Posts: 10036
Joined: Fri Sep 10, 2010 9:26 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by admin »

Looks good now :)
If you like our products and services, please help us by posting your review here.

jpena112
Posts: 1
Joined: Wed Oct 06, 2021 1:32 pm
Contact:

Re: About Question enthuware.ocajp.i.v7.2.1328 :

Post by jpena112 »

Can you explain more towards this answer

Post Reply

Who is online

Users browsing this forum: marpiva and 34 guests