使用Generics将Long []和Integer []存储在同一个HashMap中

时间:2014-07-22 21:16:15

标签: java arrays generics

我需要在HashMap中存储不同类型数值数据的数组。每个数组都是一个可测量的变量,例如温度,我需要将变量名称和单位存储在数组中,所以我在下面创建了类:

public class Variable <T> {

    public T[] array;
    public String name;
    public String unit;

    ......etc

}

我希望能够保存Integer[]Double[]Long[],这就是我使用通用<T>的原因。我尝试过使用public Number[] array,但这并不能让我保存不同的类型。

我尝试使用以下代码将其存储在HashMap<String,Variable<Number>> map中:

Variable<Long> temperature = new Variable<Long>();
map.put(temperature.name, temperature);

但是我收到了错误:

The method put(String, Variable<Number>) in the type
HashMap<String,Variable<Number>> is not applicable for the arguments
(String, Variable<Long>)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

即使LongNumber的子类,Variable<Long>也不是Variable<Number>的子类。此操作仅适用于泛型。

使用HashMap<String,Variable<? extends Number>>,您可以put()一个Variable<Long>。但是,如果没有不安全的转换,您将无法检索它,因为检索到的类型将是Variable<? extends Number>

答案 1 :(得分:4)

您可以使用wildcards来帮助您:

Map<String, Variable<? extends Number>> map = new HashMap<>();
Variable<Long> varLong = new Variable<>(new Long[]{5L});
map.put("long", varLong);
Number number = map.get("long").array[0];
System.out.println(number.doubleValue());

打印出来:5.0