Reputation: 60213
Map session = ActionContext.getContext().getSession();
session.put("user", user);
This code generates a warning: Type safety: The method put(Object, Object) belongs to the raw type Map. References to generic type Map<K,V> should be parameterized.
Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);
This code generates a warning: Type safety: Unchecked cast from Map to Map<String,Serializable>.
The getSession method belongs to Struts2 so I can't modify it. I would like to avoid using @SuppressWarnings because other warnings can be useful.
I guess all Struts2 users in the world faced the same problem... is there an elegant solution?
Upvotes: 14
Views: 48775
Reputation: 97
@SuppressWarnings("unchecked")
public class CustomHashMap<K, V> {
private class Entry {
private K key;
private V value;
public Entry(K key, V value) {
this.key = key;
this.value = value;
}
}
private LinkedList<Entry>[] entries = new LinkedList[5]; // this line shows warning to check types
}
Upvotes: 0
Reputation: 1
just write @SuppressWarnings("unchecked")
at top of the @GET
method, hope it will help you.
Upvotes: 0
Reputation: 1
Cast as Following,
public void setSession(Map<String, Object> sessionMap) {
// TODO Auto-generated method stub
this.sessionMap = (SessionMap<String, Object>) sessionMap;
}
Upvotes: 0
Reputation: 11
It is requesting you to parameterize the value, if the value needs parameters then pass them.
For example
Map<Integer, Map> vCombinedCodeMap = new HashMap<>();
will give warning for "parameterized" Map<Integer, Map>
.
so the correct format is the following:
Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>();
Upvotes: 1
Reputation: 33257
What if you do it like this:
Map<String, Serializable> session = ActionContext.getContext().getSession();
Upvotes: 0
Reputation: 719426
The safest, most efficient way to deal with this is probably:
Map<?, ?> session = ActionContext.getContext().getSession();
and then type cast the objects retrieved from the session map.
The @SuppressWarnings approach will actually result in compiled code that is identical. However the type cast will be implicit; i.e. it won't be easy to spot by looking at the source code. And the @SuppressWarnings annotation could (hypothetically) suppress some other warning in the same code block that represents a real error; i.e. one that will result in one of the hidden typecasts, etc failing at runtime.
Other more expensive alternatives include:
an entry by entry copy from the Map<?, ?>
to a new Map<String, Serializable>
instance casting the keys and values to String
and Serializable
respectively, or
a generic method like the following that performs the typecast safely.
@SuppressWarnings("unchecked")
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) {
for (Map.Entry<?, ?> entry : map.entrySet()) {
kClass.cast(entry.getKey());
vClass.cast(entry.getValue());
}
return (Map<K,V>) map;
}
Upvotes: 7
Reputation: 8608
What version of Struts 2 (especially XWork
) are you using? For me, your following code gives an error:
Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);
Cannot cast from Map<String,Object> to Map<String,Serializable>.
This, on the other hand, works and gives no warnings:
Map<String, Object> session = ActionContext.getContext().getSession();
Upvotes: 1
Reputation: 7826
I don't think there's any other way but @SuppressWarnings("unchecked"). I believe you can put it just above the line in question, and it will only suppress that line.
Edit: you can also do Map<?, ?> session = ActionContext.getContext().getSession();
but I'm not sure how willing you are to do that; you won't be able to put anything into the map that way (since the compiler can't check the type of what you're putting), only read from it.
Upvotes: 11