Re: A problem regarding generics
In article <hugmeo$5cm$1@news.albasani.net>, Lew <noone@lewscanon.com>
wrote:
Tom Anderson wrote:
See:
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#1102
57
Kevin McMurtrie wrote:
Don't quote sigs.
Java sometimes adds a non-generics method like this:
When you say "Java ... adds", do you mean in the java[x].* packages?
public void add (Object foo)
{
add((SomeClass)foo);
}
Can you give an example from the API?
It can lead to ClassCastException on nonexistent lines.
What do you mean?
Doh! I accidentally sent before I finished.
Generics can break inheritance. For example, the generics declaration
below demands that an override of put() take only a String as the key.
At the same time, HashMap without generics must take an Object as a key.
The compiler fixes this by adding a hidden method.
This compiles with a warning:
public class SnoopingMap<V> extends java.util.HashMap<String, V>
{
@Override
public V put(String key, V value)
{
System.out.println(key + " -> " + value);
return super.put(key, value);
}
public static void main (String args[])
{
SnoopingMap m= new SnoopingMap();
m.put(new Integer(4), new Integer(5));
}
}
But fails to run with an error on a bogus line number:
Exception in thread "main" java.lang.ClassCastException:
java.lang.Integer cannot be cast to java.lang.String
at SnoopingMap.put(SnoopingMap.java:1)
at SnoopingMap.main(SnoopingMap.java:13)
The javap utility shows the hidden method:
public java.lang.Object put(java.lang.Object, java.lang.Object);
Signature: (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
Code:
0: aload_0
1: aload_1
2: checkcast #16; //class java/lang/String
5: aload_2
6: invokevirtual #17; //Method
put:(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
9: areturn
LineNumberTable:
line 1: 0
That translates to this code, which will not compile if you add it
yourself:
public Object put(Object key, Object value)
{
return put((String)key, value);
{
--
I won't see Google Groups replies because I must filter them as spam