2

我确实在操作哈希图时遇到了麻烦。我的问题很简单,但我无法让它工作......

我有一个名为MultilineWritable. 我确实需要在平面文件上编组的类确实实现了这个接口,它定义了一个String toFlatFormat()函数及其相反的init(String flatFormat).

现在假设Contract该类确实实现MultilineWritable并由整数标识,而Person该类也实现了此接口但由字符串标识。

我编组合同和人员的 HashMap 的功能如下:

public void marshall(HashMap<Object, MultilineWritable>){}

我的问题是我找不到将 aHashMap<String, Person>转换为 a 的方法HashMap<Object, MultilineWritable>,即使StringextendsObjectPersonextends也是如此MultilineWritable。对于 a HashMap<Integer, Contract>... 的铸造也是如此,因此我不能调用我的通用函数。

感谢有关此问题的任何帮助。

4

3 回答 3

8

假设您的marshall方法只读取值,您应该将声明更改为:

public void marshall(HashMap<?, ? extends MultilineWritable> map)

问题是,如果允许现有方法调用,它可能会尝试将任何 MultilineWritable方法放入映射中——即使它是错误的映射类型:

Map<String, Person> map = new HashMap<String, Person>();

// What would you want map.put("foo", new Contact()) to do inside marshall?
marshall(map);

编辑:有关通配符的更多详细信息,请参阅Java 泛型常见问题解答

于 2012-08-14T13:15:39.557 回答
0

您要做的是将 a 传递给specific typea generic type。你需要使用java的generics特性。泛型提供compile time safety only,因此虽然您可以将特定类型传递给采用遗传类型的函数,但不允许修改集合或映射。

所以简而言之,你的分析器是:

public void marshall(HashMap<? extends Object, ? extends MultilineWritable> map)
于 2012-08-14T13:25:04.480 回答
0

在 Java 中,泛型不是协变的。所以你不能做以下

    List<Integer> numList = new ArrayList<Integer>();
    List<Number> numList = new ArrayList<Number>();
    numList = numList; //Error
    numList = (List<Number>)intList; //error

编译器使用泛型来进行类型安全。实际类型信息(集合的,即这是整数列表)等在运行时丢失。

于 2012-08-14T13:32:44.453 回答