Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何强制转换getter的返回值_Java_Hashmap - Fatal编程技术网

Java 如何强制转换getter的返回值

Java 如何强制转换getter的返回值,java,hashmap,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"); 使用以下选项可能会更

我有一个名为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")
var t=x.get(“foo”)

但我不确定这样的事情是否可能。

啊哈,我认为这是可行的:

public <V> V get(String s) {
  return (V)this.map.get(s);
}
public V get(字符串s){
返回(V)此.map.get(s);
}
我当然会得到这样的警告:


您还可以在创建时将泛型类型向下传递给HashMap成员,并在不使用强制转换的情况下检索正确的类型

class ClassUsingHashMap<T>{
    private HashMap<String, T> map = new HashMap<String, T>()
}
使用HashMap的类{ 私有HashMap=newhashmap() }
您应该通过使整个类成为泛型来使您的
HashMap
也成为泛型的:

class MyClass<V> {
    private Map<String, V> map = new HashMap<>();

    public V get(String s) {
        return this.map.get(s);
    }
}
class-MyClass{
私有映射映射=新的HashMap();
公共V get(字符串s){
返回此.map.get(s);
}
}

如果您事先不知道值的类型,可以使用
对象传递类型信息:

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);
    }
}
但是如果“key”存储的值不是
整数
,那么这将导致
ClassCastException
爆炸,因此您必须非常小心

但是如果你事先知道值的类型,它只是

public class MapContainer<T> {
    private Map<String, T> map = new HashMap<>();

    public T get(String s) {
        return this.map.get(s);
    }
}
公共类映射容器{
私有映射映射=新的HashMap();
公共T获取(字符串s){
返回此.map.get(s);
}
}

地图的定义是什么?映射字段/成员的类型与so
public final HashMap映射类似为什么您的值类型是
对象
?而不是泛型?@JoeC我想让它泛型,不是吗?我不太理解泛型,我的意思是Java意义上的(即
HashMap
)。只要映射是
,我认为这是一个糟糕的设计。好吧,如果它是一个糟糕的设计,我该如何改进它?这就是为什么我发布了OP,更多的是为了得到建议,而不是任何东西。但是在我的例子中,并不是所有类型的映射都是V型的,映射中的值可以是任何类型,所以V只是对象遗传的,这些类型共享除Object之外的一个公共超类型?如果是这样的话,请定义
MyClass
,并在该代码之外进行最后的强制转换。除了Object@MrCholo如果它们不共享一个公共类型,那么所有对象实际上都需要在同一个映射中吗?您的示例看起来好像您必须知道每个键的值的类型,所以您可以简单地将它们存储在不同的映射中以获得类型safety@MrCholo:如果他们不共享超级类型,那么集合是关于什么的?你叫它什么名字?它是“我想保留供以后使用的任何对象”还是“我的全局可访问对象集合”?想一想:你是否将所有物品(如黄油和衣服)都存放在同一个地方(如烤箱),然后你按它们的名字取它们?这就是你所实现的。
public class MapContainer<T> {
    private Map<String, T> map = new HashMap<>();

    public T get(String s) {
        return this.map.get(s);
    }
}