Java:使 Map<> 变量之一泛型



我需要将变量和值作为一对存储在某个地方,我倾向于使用Map。问题是值的类型会有所不同,所以我认为应该使用通用。所以我尝试这样做:

Map<String, T> netPara;

当然它不工作,然后我尝试

Map<String, Object> netPara;

这工作,但当我检索值,它只返回类型的对象,而不是"布尔","int"。

有谁能帮我吗?我相信这很简单,但我还不是专家。提前谢谢。

实际上我有一个接收参数列表的函数a,但它的函数B也将使用这些参数,但B的参数列表是空的,所以我希望将它们存储为类参数并由函数B重用。下面是我所做的:

Class Person() {
Map<String, T> infoPaire; // if I use Object to replace T
Function A: receiver(boolean b, int i, String1 st1, String2 st2) {
    infoPaire.put("b", b);
    infoPaire.put("i", i);
    infoPaire.put("st1", st1);
    infoPaire.put("st2", st2);
}
Function B: user() {
    boolean b = infoPaire.get("b"); // I need to add (boolean) to cast and I dont want it, it's ugly
    int i = infoPaire.get("i");
    String st1 = infoPaire.get("st1");
    String st2 = infoPaire.get("st2");
}

T需要定义为类或方法上的泛型参数。

<标题>
public <T> Map<String, T> getMap(){
    return new HashMap<String, T>();
}
<标题> 类
public class Test <T> {
    public Map<String, T> getMap(){
        return new HashMap<String, T>();
     }
}
使用

当使用

方法时
Test t = new Test();
Map<String, Double> m = t.<Double>getMap();

或者更简洁地说,

Map<String, Double> m = t.getMap();

因为Double可以从右边推断出来。

与一个类。

Test<String> t = new Test<String>;

或带类型推断的

Test<String> t = new Test<>;

Map<String, Integer> m = t.getMap()

和所有在一起,

Test<String> t = new Test<>;
Map<String, String> m = t.getMap();
Test<Integer> t2 = new Test<>;
Map<String, Integer> m2 = t2.getMap();
<标题> 警告

对于类型推断的东西,即没有类型参数的<>t.getMap(),您必须使用Java 7或更高版本。

关于一般类型系统的其他警告

使用泛型允许您创建代码来操作值,而不知道它们是什么,但有一些注意事项。关于你的问题,听起来你可能试图在Map中存储两个不同类型的值,就像这样,

m.put('int', 7)
m.put('bool', true)

这是不可能的。因为T虽然是泛型的,但最终必须解析为类实例的单一类型。例如,

Map<String, Integer> m;

此映射只能保存 Integer 值。

Object声明为值的原因是 Java中的每个类都是Object的子类,所以任何东西都可以在那里。但是使用Object是非常糟糕的设计。您实际上是在关闭类型系统,这是Java等语言带来的主要优势之一,即静态类型。

因此,如果您发现自己想要存储同质值的集合,您可能需要重新考虑您的设计。即使在明确允许这种事情的语言(scheme, python, JavaScript等)中,以同构方式使用它们通常也是设计缺陷的标志。

我现在明白你问的问题和我原来想的有点不同。我将保留我的其他答案,因为它解释了为什么这是一个问题。

由于您只处理Strings, BooleansIntegers,您可以通过仅将Strings存储在Map中并稍后转换为适当的类型来做您所要求的。

Map<String, String> m = new HashMap<>();
m.put("bool", "true");
m.put("int", "1");
Integer i = Integer(m.get("int"));
Boolean b = Boolean(m.get("bool"));

这将是伪安全的,但是您必须在代码的其他地方跟踪值的类型。

可能最好的解决方案是使用三个Maps,每种类型一个。

Map<String, String> stringMap;
Map<String, Integer> intMap;
Map<String, Boolean> boolMap;

一般来说,有三个地图确实没有害处。

为什么不能干净利落地使用一个map,请看我对这个问题的另一个回答

可以将其中一种类型作为类型参数,但随后必须将其声明为类型参数。仅仅给它一个单字母的名字,比如T,并不能自动使它成为一个类型参数。

class MyClass<T> {   // Note: T is a type parameter
    private Map<String, T> netPara;
    // ...
}

你所能期望的最好的情况是一个Object类型的value和一个具有不安全强制类型转换的类型化getter方法:

class VariableMap extends HashMap<String, Object> {
   public <T> T getValue(Object key) {
       return (T)super.get(key);
   }
{

将元素放入地图的方法如下:检查一次

 public class TakingInput {
public static void main(String[] args) {
Map<String,Object> map=new HashMap<String,Object>();
Integer in=new Integer(123);
Object obj=in;
String s=new String("suresh");
Object obj2=s;
map.put("hi",obj);
map.put("ramesh",obj2);
System.out.println(map);
  //to retrive 
 String ss=(String) map.get("ramesh"); //type casting
System.out.println(ss); //o/p:suresh

}
 }

你想要像

BigDecimal n = dictionary.get("n");
String s = dictionary.get("s");

可以有

class Dictionary {
    public <T> T get(String name) { ... }

由于类型擦除(编译/运行时代码不再知道泛型类型),不能这样做,强制转换对象以t返回

解决方案:

BigDecimal n = dictionary.get(BigDecimal.class, "n");
String s = dictionary.get(String.class, "s");

可以通过运行时强制转换异常实现:

public class Dictionary {
    private Map<String, Object> map = new HashMap<>();
    public <S> S put(Class<S> type, String name, S value) {
        Object oldValue = map.put(name, value);
        return type.cast(oldValue);
    }
    public <T> T get(Class<T> type, String name) {
        Object value = map.get(name);
        return type.cast(value);
    }
}

可以存储类型本身,可能作为附加键,Map<Class<?>, Map<String, Object>>>,但在这个过于开放的问题上下文中,您仍然不会获得太多信息。

首先需要了解泛型和类型转换。就你的问题而言,对象类站在继承的顶层,意味着对象是所有java类的父类。

因此,您可以将任何对象强制转换为object类而不进行强制转换,但是当您需要将对象返回到其实际类中时,您必须强制转换它。like String str = (String) netPara.get(key);

您需要研究多态性、类型转换和泛型概念。通用来解决你现在面临的问题。

最新更新