About Question enthuware.ocajp.i.v7.2.1328 :
Moderator: admin
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Try it out
If you like our products and services, please help us by posting your review here.
-
- Posts: 32
- Joined: Wed Mar 14, 2012 5:45 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
already didadmin wrote:Try it out
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
So what did you find out?
If you like our products and services, please help us by posting your review here.
-
- Posts: 32
- Joined: Wed Mar 14, 2012 5:45 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
this:
A a = (B)(I) b;
can be broken down to..
I i = b; // i don't even need the (I) here because B is I (upward cast).
A a = (B) i; // here (B) is needed to pass the compiler time error. At runtime i points to an Object of type B.
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Very good
If you like our products and services, please help us by posting your review here.
-
- Posts: 3
- Joined: Fri Mar 29, 2013 2:53 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
So, I i = (C) a fails because you can't cast an object to a class that I is not, you can only reference to a class that is an I, like that has been said I i = b, and then using polymorphism do a A a = (C) b, since C is a B is an A is an I? Or does the cast on the b here need to be the actual class that it is in runtime, which is B?
If it looks like I have no idea how polymorphism works, it's because I don't. God help me when I attain a Java developer position...
If it looks like I have no idea how polymorphism works, it's because I don't. God help me when I attain a Java developer position...
-
- Posts: 33
- Joined: Mon May 06, 2013 9:41 am
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Just a small question about
The explanation is as follows: It will compile because a C is-a A, which is-a I, and a reference of class A can point to an object of class C. But it will fail at runtime because a does not point to an object of class C.
Didn't the bold part possibly wanted to state: a reference of interface I can point to an object of class C?
Just because this is what actually seems to happen here
It is definitely true in its current form as well, but does not seem to exactly cover the scenario, and also seems to be redundant, given that "C is-a A" has been already stated in the first half of the sentence
Code: Select all
I i = (C) a;
Didn't the bold part possibly wanted to state: a reference of interface I can point to an object of class C?
Just because this is what actually seems to happen here
It is definitely true in its current form as well, but does not seem to exactly cover the scenario, and also seems to be redundant, given that "C is-a A" has been already stated in the first half of the sentence
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
No, 'a' is declared as a reference of class A. Since the given code is "(C) a" the explanation says that a reference of class A can point to an object of class C to explain why 'a' can be cast to C.
The fact "A implements I" is the basis for a valid assignment of a to i.
HTH,
Paul.
The fact "A implements I" is the basis for a valid assignment of a to i.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
BTW, the exact rules for casting are given by JLS here: http://docs.oracle.com/javase/specs/jls ... #jls-5.5.1
One should try these out by going through the specification and writing sample programs to improve understanding.
HTH,
Paul.
One should try these out by going through the specification and writing sample programs to improve understanding.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
-
- Posts: 33
- Joined: Wed Nov 13, 2013 4:11 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Hello,
I thought I got this icasting concept but am afraid I don't follow...Keep answering these questions wrong!
We have this (slight variation of the question's class hierarchy but esentially the same):
If C is-a B is-a A is I why can't I cast var a to b by:
a = (B)a;?
The compiler says
"Exception in thread "main" java.lang.ClassCastException: LearnJava.A cannot be cast to LearnJava.B"
Thanks,
Marc
I thought I got this icasting concept but am afraid I don't follow...Keep answering these questions wrong!
We have this (slight variation of the question's class hierarchy but esentially the same):
Code: Select all
package LearnJava;
public class LearnJava {
public static void main(String args[]) {
A a = new A();
B b = new B();
a = (B)a;
}
}
interface I{
}
class A implements I{
void a(){
System.out.println("Method a() from A");
}
}
class B extends A {
void b(){
System.out.println("Method b() from B");
}
}
a = (B)a;?
The compiler says
"Exception in thread "main" java.lang.ClassCastException: LearnJava.A cannot be cast to LearnJava.B"
Thanks,
Marc
Last edited by admin on Mon Nov 25, 2013 1:44 pm, edited 2 times in total.
Reason: Please use code tags
Reason: Please use code tags
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
I don't see any C in your code.
The code you've quoted above will fail at run time because a is pointing to an object of class A, and you are trying to cast it as B. So why do you think it should work? B is A but A is not B.
-Paul.
The code you've quoted above will fail at run time because a is pointing to an object of class A, and you are trying to cast it as B. So why do you think it should work? B is A but A is not B.
-Paul.
If you like our products and services, please help us by posting your review here.
-
- Posts: 33
- Joined: Wed Nov 13, 2013 4:11 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Here is code like in question. Added functions in class for clarity:
package LearnJava;
interface I{
}
class A implements I{
void a1(){
System.out.println("A.m1()");
}
}
class B extends A {
void b1(){
System.out.println("B.m1()");
}
}
class C extends B{
void c1(){
System.out.println("C.m1()");
}
}
//And the following declarations:
class LearnJava{
public static void main(String[] args) {
A a = new A();
B b = new B();
a = (B)(I)b;
a.b1();
}
}
Line a = (B)(I)b; compiles ok and gives no RE as the correct answer says. I don't understand what's happening here. Is it a cast from a to b? If so, why does a.b1(); give an compiler error "Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: LearnJava.A.b1"?
package LearnJava;
interface I{
}
class A implements I{
void a1(){
System.out.println("A.m1()");
}
}
class B extends A {
void b1(){
System.out.println("B.m1()");
}
}
class C extends B{
void c1(){
System.out.println("C.m1()");
}
}
//And the following declarations:
class LearnJava{
public static void main(String[] args) {
A a = new A();
B b = new B();
a = (B)(I)b;
a.b1();
}
}
Line a = (B)(I)b; compiles ok and gives no RE as the correct answer says. I don't understand what's happening here. Is it a cast from a to b? If so, why does a.b1(); give an compiler error "Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: LearnJava.A.b1"?
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
It will be a bit difficult to explain this. But I can try:
At runtime, b refers to an object of class B. Since B implement I, (I)b is valid as compile as well as runtime. Let's calls (I)b as i.
Now, since I is an interface, (B)i is valid at compile time and is valid at runtime because i indeed points to an object of class B. Let's call (B)i as x.
a = x is valid at compile time because x is of type B and B is a A. It is also valid at run time because x indeed points to an object of class B.
a.b1() won't work because the class of reference a is A, which does not have the method b1().
I would suggest you refer to a book to understand this better.
HTH,
Paul.
At runtime, b refers to an object of class B. Since B implement I, (I)b is valid as compile as well as runtime. Let's calls (I)b as i.
Now, since I is an interface, (B)i is valid at compile time and is valid at runtime because i indeed points to an object of class B. Let's call (B)i as x.
a = x is valid at compile time because x is of type B and B is a A. It is also valid at run time because x indeed points to an object of class B.
a.b1() won't work because the class of reference a is A, which does not have the method b1().
I would suggest you refer to a book to understand this better.
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
-
- Posts: 33
- Joined: Wed Nov 13, 2013 4:11 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Ok, I understand this is not a cast from a to B...
Thanks for explanation.
Thanks for explanation.
-
- Posts: 33
- Joined: Wed Nov 13, 2013 4:11 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Hello,
I try to get my finger behind casting but not 100% sure I get it...
In below code, a.m1(); prints "C.m1()". In plain English it does the following:
B b = new C(); ==>
"Create a reference of type B b and assign to it (aka 'point it to') an instance of subclass C
B a = (B)(I)b; ==>
I tmp = (I)b; // Treat reference to instance C as reference to interface I;
B a = (B)tmp; // treat reference to interface I as reference to
an instance of class B (this is possible because B implements I via A);
WHY does a.m1() not give me the output "B.m1()"? if a points to instance of B it should?
======
I try to get my finger behind casting but not 100% sure I get it...
In below code, a.m1(); prints "C.m1()". In plain English it does the following:
B b = new C(); ==>
"Create a reference of type B b and assign to it (aka 'point it to') an instance of subclass C
B a = (B)(I)b; ==>
I tmp = (I)b; // Treat reference to instance C as reference to interface I;
B a = (B)tmp; // treat reference to interface I as reference to
an instance of class B (this is possible because B implements I via A);
WHY does a.m1() not give me the output "B.m1()"? if a points to instance of B it should?
======
Code: Select all
class LearnJava{
public static void main(String[] args) {
B b = new C();
B a = (B)(I)b;
a.m1();
}
}
interface I{}
class A implements I{
public void m1(){
System.out.println("A.m1()");
}
}
class B extends A{
public void m1(){
System.out.println("B.m1()");
}
}
class C extends B{
public void m1(){
System.out.println("C.m1()");
}
}
class D extends C{
public void m1(){
System.out.println("D.m1()");
}
}
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
>>WHY does a.m1() not give me the output "B.m1()"? if a points to instance of B it should?
Because a does not point to an instance of B. It points to an instance of C. That what is polymorphism. http://docs.oracle.com/javase/tutorial/ ... phism.html
HTH,
Paul.
Because a does not point to an instance of B. It points to an instance of C. That what is polymorphism. http://docs.oracle.com/javase/tutorial/ ... phism.html
HTH,
Paul.
If you like our products and services, please help us by posting your review here.
-
- Posts: 28
- Joined: Wed Dec 04, 2013 7:57 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Hello, Paul I ran the code:
class TestClass{
public static void main(String[] args){
A a = new A();
B b = new B();
a = (B)(I)b;
b = (B)(I) a;
//I i = (C) a;
//I i = (C) a;
}
}
interface I{}
class A implements I{}
class B extends A {}
class C extends B{}
and answer #2: b = (B)(I) a; actually didn't fail.
class TestClass{
public static void main(String[] args){
A a = new A();
B b = new B();
a = (B)(I)b;
b = (B)(I) a;
//I i = (C) a;
//I i = (C) a;
}
}
interface I{}
class A implements I{}
class B extends A {}
class C extends B{}
and answer #2: b = (B)(I) a; actually didn't fail.
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
That is because you already have "a = (B)(I)b;". You need to comment it out first.
If you like our products and services, please help us by posting your review here.
-
- Posts: 2
- Joined: Tue Feb 04, 2014 4:30 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Hi,
Given the following code:
My question is with the line in bold/red. My understanding is that for the compiler to be ok, it just needs to be satisfied that the classes are in the same hierarchy and as a result it may work (up the tree implicit casting, down the tree requires explicit casting). Whenever I have come across ClassCastException it is because the reference was pointing to an object up the tree e.g. a ref of type B pointing to an object of type A.
The line in question appears to be a ref of type A pointing to an object of type A. The cast to (B) obviously is what is causing the ClassCastException. Can someone explain please what it does to effect this? Is the A ref a, a B ref all of a sudden??
Thanks,
Sean.
Given the following code:
Code: Select all
class A{}
class B extends A {}
public class Test {
public static void main(String[] args) {
A a = new A();
A a1=new A();
B b = new B();
// a=b;// ok
// b=(B)a;// ClassCastException
// a=(A)a1; // ok
// a=a1; // ok
a=(B)a1; // compiles ok, ClassCastException???
}
}
The line in question appears to be a ref of type A pointing to an object of type A. The cast to (B) obviously is what is causing the ClassCastException. Can someone explain please what it does to effect this? Is the A ref a, a B ref all of a sudden??
Thanks,
Sean.
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
You've written about your understanding about compiler. But then you are talking about ClassCastException, which happens only at run time.
I am not really clear about what you are asking? ClassCastException is thrown whenever the object that you are trying to cast to a reference of another class cannot be cast to that class.
I don't think in your code b=(B)a should throw ClassCastException because a is actually pointing to an object of class B because of a=b; written earlier.
I am not really clear about what you are asking? ClassCastException is thrown whenever the object that you are trying to cast to a reference of another class cannot be cast to that class.
I don't think in your code b=(B)a should throw ClassCastException because a is actually pointing to an object of class B because of a=b; written earlier.
If you like our products and services, please help us by posting your review here.
-
- Posts: 2
- Joined: Tue Feb 04, 2014 4:30 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Thanks for the reply. I think I have it figured: my confusion was arising because of the fact that given the assignment
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:
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.
Code: Select all
A a = (B)new A(); // where B extends from A
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
Is that accurate?
Regards,
Seán.
-
- Site Admin
- Posts: 10058
- Joined: Fri Sep 10, 2010 9:26 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Yes, that is correct.
If you like our products and services, please help us by posting your review here.
-
- Posts: 6
- Joined: Sun Dec 20, 2015 1:23 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
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.
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.
-
- Posts: 6
- Joined: Sun Dec 20, 2015 1:23 pm
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
Ahhh...
Nevermind!
Nevermind!
-
- Posts: 4
- Joined: Wed Jan 06, 2016 5:38 am
- Contact:
Re: About Question enthuware.ocajp.i.v7.2.1328 :
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!
I'd appreciate if somebody interested and competent would find the time to verify, if my understanding is correct. Many thanks!
Who is online
Users browsing this forum: No registered users and 114 guests