aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Q on casting Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Q on casting" Watch "Q on casting" New topic
Author

Q on casting

Reshma Shanbhag
Ranch Hand

Joined: Sep 17, 2002
Posts: 203
Hi All,

The above code compiles fine but at runtime throws a ClassCastException.
My query is, how is the compilation successful when the interface 'Test' and class 'Check' are no way related.
Plz enlighten me on this.
reshma


SCJP 1.4, SCWCD 1.4
Tausif Khanooni
Ranch Hand

Joined: Nov 14, 2002
Posts: 107
Hello Reshma,
It will compile, because this kind of casting
tells compiler that u r taking the resposibility
of your code. but when u will run the program,
it will check and throw error.
hope it helps


"Walking on water and building IT Architecture from <br />specification are easy if and only if both are frozen"
Jonathan Lavely
Greenhorn

Joined: Mar 25, 2003
Posts: 2
I believe you can cast a "Class" to an "Interface" as the example shows at compile time, but if the reverse happens, where you try to cast an Interface to a class, you'll get a compile error.
sun par
Ranch Hand

Joined: Oct 03, 2002
Posts: 257
The concept is there might be a super class of check that implements test. So the compiler makes provision for this, by allowing an unrelated class to be castable to an interface type.


Sunita<br />SCJP 1.4
Marlene Miller
Ranch Hand

Joined: Mar 05, 2003
Posts: 1391
Sunita, did you intend to say a subclass of Check instead of saying a superclass?
sun par
Ranch Hand

Joined: Oct 03, 2002
Posts: 257
Nope.. Superclass, bcos if superclass implements an interface, the sub class automatically implements the interface.
Reshma Shanbhag
Ranch Hand

Joined: Sep 17, 2002
Posts: 203
java guru's on ranch plz help me with this question ..
Dan Chisholm
Ranch Hand

Joined: Jul 02, 2002
Posts: 1865
I agree with Tausif. The compiler assumes that the programmer knows what he/she is doing. At run time, the JVM finds that the cast is not legal and so an exception is thrown.


Dan Chisholm<br />SCJP 1.4<br /> <br /><a href="http://www.danchisholm.net/" target="_blank" rel="nofollow">Try my mock exam.</a>
Dan Chisholm
Ranch Hand

Joined: Jul 02, 2002
Posts: 1865
Originally posted by sun par:
...if superclass implements an interface, the sub class automatically implements the interface.

Your statement is correct--"if superclass implements an interface, the sub class automatically implements the interface." However, the compiler knows all about the superclasses and is able to check any assumptions concerning a superclass. Remember, a class has an "extends" clause that specifies the superclass and an implements clause that specifies which interfaces are implemented. A class, however, does not have an "extended by" clause that specifies subclasses so the compiler does can not make any assumptions concerning subclasses. For example, the compiler can not know which interfaces might be implemented by a subclass.
Reshma Shanbhag
Ranch Hand

Joined: Sep 17, 2002
Posts: 203
Whats the difference
'Test t = (Test) c;'
from the above code and
'String s = (String) new StringBuffer();'
Dan Chisholm
Ranch Hand

Joined: Jul 02, 2002
Posts: 1865
Originally posted by Reshma Pai:
Whats the difference
'Test t = (Test) c;'
from the above code and
'String s = (String) new StringBuffer();'

The following is a quote from
Section 5.5 of the Java Language Specification.
"Some casts can be proven incorrect at compile time; such casts result in a compile-time error."
A cast from StringBuffer to String would fall into the "can be proven incorrect at compile time" category. The compiler knows that a StringBuffer is not a subclass of String so the cast results in a compile time error.
The compiler accepts the following cast
Test t = (Test) c;
Because Test is an interface and because a subclass of Check might implement Test.
The following is another quote from Section 5.5 of the JLS.
The remaining cases involve conversion between reference types. The detailed rules for compile-time correctness checking of a casting conversion of a value of compile-time reference type S (source) to a compile-time reference type T (target) are as follows:
If S is a class type:

If T is a class type, then S and T must be related classes-that is, S and T must be the same class, or S a subclass of T, or T a subclass of S; otherwise a compile-time error occurs.
If T is an interface type:
  • If S is not a final class (�8.1.1), then the cast is always correct at compile time (because even if S does not implement T, a subclass of S might).
  • If S is a final class (�8.1.1), then S must implement T, or a compile-time error occurs.

  • [ March 29, 2003: Message edited by: Dan Chisholm ]
     
    I agree. Here's the link: http://aspose.com/file-tools
     
    subject: Q on casting