如何转换getter的返回值

时间:2019-02-09 21:35:58

标签: java hashmap

我有一个名为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")

但我不确定是否可能发生这种情况。

4 个答案:

答案 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)

啊,我认为这可行:

public <V> V get(String s) {
  return (V)this.map.get(s);
}

我当然会收到此警告:

enter image description here