我有一个名为map的HashMap作为成员,我使用以下方法从中检索值:
public Object get(String s) {
return this.map.get(s);
}
我想我可以使用泛型将其转换为某种东西,以便我们可以将内联返回值转换为类似的内容:
public V get(String s) {
return (V)this.map.get(s);
}
但是不能编译。基本上,不要这样做:
var t = (Zoom)x.get("foo");
使用起来可能不错:
var t = x.<Zoom>get("foo")
但我不确定是否可能发生这种情况。
答案 0 :(得分:2)
您还应该通过使整个类通用来使HashMap
通用:
class MyClass<V> {
private Map<String, V> map = new HashMap<>();
public V get(String s) {
return this.map.get(s);
}
}
答案 1 :(得分:1)
您还可以在创建时将泛型类型传递给HashMap成员,并在不进行强制转换的情况下获取正确的类型。
class ClassUsingHashMap<T>{
private HashMap<String, T> map = new HashMap<String, T>()
}
答案 2 :(得分:1)
如果您事先不知道值的类型,则可以使用Class
对象传递类型信息:
public class MapContainer {
private Map<String, Object> map = new HashMap<>();
public <V> V get(String s, Class<V> classOfValue) {
Object value = this.map.get(s);
return classOfValue.cast(value);
}
}
然后就做
Integer intValue = container.get("key", Integer.class);
但是,如果“键”存储的值不是ClassCastException
,则会以Integer
爆炸,因此您必须非常小心。
但是如果您事先知道值类型,那只是
public class MapContainer<T> {
private Map<String, T> map = new HashMap<>();
public T get(String s) {
return this.map.get(s);
}
}
答案 3 :(得分:0)