Re: enum/generics typesafe getter for generic types
Piotr Kobzda wrote:
visionset wrote:
Yes, but how do I now use this class to form a generic getter outside
of Key class?
For this kind of call:
String s = foo.get(Key.A_KEY);
because I'm not instantiating Key, I can't pass in a <Type> so I can't
form a generic method.
You can, declare it e.g. like that:
public <T> T get(Key<T> key) { ...
Well, honestly, I'm not fully sure /you can/. It depends mostly on what
you are trying to achieve. My understanding of your goal is expressed
in attached example (SSCCE). If that not match your expectations,
explain them deeper.
piotr
--
import java.util.HashMap;
import java.util.Map;
public class MultivalueProperty {
public static class Key<T> {
Class<T> type;
Key(Class<T> type) {
this.type = type;
}
static <T> Key<T> newKey(Class<T> type) {
return new Key<T>(type);
}
public static final Key<String> A_KEY = newKey(String.class);
public static final Key<String> B_KEY = newKey(String.class);
public static final Key<Integer> C_KEY = newKey(Integer.class);
public static final Key<Integer> D_KEY = newKey(Integer.class);
// possibly better hashCode() is needed here...
}
private Map<Key<?>, Object> values = new HashMap<Key<?>, Object>();
public <T> T get(Key<T> key) {
return key.type.cast(values.get(key));
}
public <T> void put(Key<T> key, T value) {
values.put(key, value);
}
// sample usage...
public static void main(String[] args) {
MultivalueProperty foo = new MultivalueProperty();
foo.put(Key.A_KEY, "A value");
foo.put(Key.C_KEY, 0);
String a = foo.get(Key.A_KEY);
String b = foo.get(Key.B_KEY);
Integer c = foo.get(Key.C_KEY);
Integer d = foo.get(Key.D_KEY);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}