Classes incorrectly casted using a HashMap
gymoese May 31, 2006 10:28 AMI'm using JBossCache for a product in Hewlett Packard and here I have seen a strange issue that I have not been able to resolve.
The problem is that I have a HashMap wrapped in a annotated class that also holds some additional information. When I draw the keyset from the HashMap and iterate over the keys I see is that the type of the keys entered have changed to String.
I positively know that I put a Long as the key in the HashMap, however when I iterate usign the set returned from the keyset all the keys have "changed" type to String.
I have created a small test application that I have entered into the examples directory in the JBossCache 1.3.0.SP1 kit that I have downloaded. I have made a copy of the annotated50 example and modified this to present my problem to ensure that I have no impact from "other" sources.
I run with Suns 1.5_06 Java
The code for the "main" part of the application is very simple and looks like this. The result of the code is that the text "This is a String" is printed on stdout.
try {
distributedInfo = new TreeCacheAop();
PropertyConfigurator config = new PropertyConfigurator();
config.configure(distributedInfo, "META-INF/replSync-service.xml");
distributedInfo.setClusterName("ClassCastIssue");
distributedInfo.start();
} catch (Exception e) {
e.printStackTrace();
}
// Add the map container element for the distribution
try {
map = new CachedMap();
distributedInfo.putObject(NODE_JOB_RELATION_CACHE_PATH, map);
} catch (CacheException e) {
e.printStackTrace();
}
map.put(new Long(123), new Integer(234));
Iterator i = map.keySet().iterator();
Object obj = i.next();
System.out.println("Class name = " + obj.getClass().getName());
if (obj instanceof String) {
System.out.println("This is a String");
}
if (obj instanceof Long) {
System.out.println("This is a Long");
}
The code for the annotated wrapper class including the map looks like this:
@org.jboss.cache.aop.annotation.PojoCacheable
public class CachedMap
{
private HashMap map = new HashMap();
public void put(Long id, Object bean)
{
map.put(id, bean);
}
public Object get(Long id)
{
return map.get(id);
}
public void remove(Long id)
{
map.remove(id);
}
public Set keySet()
{
return map.keySet();
}
}
Can anyone tell me what is happening here - am I doing anything wrong - to me this mostly seems like a bug!
Regards
Peter