From the Java Language Specifications, 2nd Edition:
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: o 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). o If S is a final class (�8.1.1), then S must implement T, or a compile-time error occurs.
I bolded the key sentence, which says that the object referenced by j could actually be a subclass of Jchq which does implement Bicycle. If this is not true, a run-time exception will be thrown.
This rule seems quite a stretch, considering the rule requiring compile-time provable initialization of variables before use, but there it is.
SCJP 1.4, SCWCD in process
I’ve looked at a lot of different solutions, and in my humble opinion Aspose is the way to go. Here’s the link: http://aspose.com