<< Chapter < Page | Chapter >> Page > |
The great promise of generics is that it can sometimes cause programming errors to be recognized at compile time instead of encountering them at runtime.
Obviously, the best approach is to avoid writing programs containing programming errors in the first place. However, if you are going to writeprograms containing errors, it is usually better to catch them at compile time than to have them occur at runtime. This is the thing that may make thecomplexity of generics worthwhile.
The program named Generics02 (shown later in Listing 6 ) illustrates the application of an incorrect cast to an element that is retrievedfrom an ArrayList object, along with the runtime error that is produced by that incorrect cast.
No compiler error
This program does not produce a compiler error.
(However, the Java version 1.5 compiler does produce a warning having to do with the failure to apply the new generics syntax that was released inJava version 1.5. Note that earlier compilers would not have produced such a warning.)
The point here is that the compiler does not check to confirm that the correct cast is applied. This results in a successful compilation, but theprogram throws an exception at runtime.
A ClassCastException
The runtime exception that is thrown by this program is shown in Figure 3 . You can compare the details of this exception with the program code later.The reference to line 46 in Figure 3 is a reference to the statement in Listing 6 that attempts to cast the reference to type Date . (That reference was originally a reference to an object of type String .)
Figure 3 - A ClassCastException. |
---|
Exception in thread "main" java.lang.ClassCastException:
java.lang.String cannotbe cast to java.util.Date
at Generics02.runIt(Generics02.java:46)at Generics02.main(Generics02.java:53) |
The program code
The program is shown in its entirety in Listing 6 . As before, the main method instantiates an object of the Generics02 class and calls the runIt method on that object. Also as in the previous program, this programinstantiates a new ArrayList object and saves the object's reference in the instance variable named var1 .
The runIt method
The runIt method begins by populating the ArrayList object with references to two different objects of different types. One of the objectsis type Date . The other object is type String .
A questionable programming style
While this is probably not a very good programming style, it is a style that was commonly used by Java programmers prior to the advent of generics. Itwas common to populate collection objects with references to a mixture of objects of different types.
References are stored as type Object
As you already know, when these object's references are put into the collection, the types of all the references are automatically converted to type Object . As you also already know, when the references are retrieved from the collection, if the purpose is to call any method on a reference otherthan one of the eleven methods defined in the Object class, it is necessary to cast the reference to a type that is consistent with the method.
Notification Switch
Would you like to follow the 'Object-oriented programming (oop) with java' conversation and receive update notifications?