【问题标题】:Java Bounded Type Parameters in HashMapHashMap 中的 Java 有界类型参数
【发布时间】:2015-10-04 16:45:34
【问题描述】:

我只是在学习如何使用通配符和有界类型参数。我想在传递 HashMap 的方法中使用(我认为)有界通配符。我已经看到了有界类型参数和有界通配符的示例,但我没有找到任何东西可以告诉我如何将 HashMap 传递给 HashMap 可以包含不同值对象的方法。

Map<Integer, Company>
Map<Integer, Employee>
Map<Integer, Location>

这是我上面列出的第一个地图的示例:

public Map<Integer, Company> readXML(Map<Integer, Company> companies) {

我想使用类似以下的方法来启用此方法来处理我上面列出的任何地图。

public Map<Integer, ?> readXML(Map<Integer, ?> values) {

有人可以向我展示一个示例,说明如何在此方法中将通配符用于 Map 值吗?

1) 我是否需要创建一个扩展值对象(Company、Employee、Location)的 Map 类?

2) 或者有没有更好的方法来实现这一点?换句话说,我做错了吗?

感谢您的建议。

【问题讨论】:

  • CompanyEmployeeLocation是什么关系?除了Object之外,它们还有共同的超类型吗?
  • 要在参数类型之间或参数与返回类型之间进行约束(表示关系),您必须使用类型变量。通配符不允许您创建这种关系,它们只是限制特定的参数或返回类型。
  • @AndyTurner - 唯一常见的超类型是 Object。我只是想想出一种聪明的(非新手)方法来使用相同的 XML 解析器方法来解析我的任何 Map Object 值的值。

标签: java hashmap bounded-wildcard bounded-types


【解决方案1】:

由于您的方法 readXML(Map&lt;Integer, ?(V)&gt; companies) 可以接受类型为 Company、Employee 和 Location 的 V。您可以通过下面提到的方式解决此问题。

  1. 您可以使所有提到的类扩展新类,或者可以实现我们的自定义 Type 接口并将该类型用于V

  2. 向您的方法添加附加参数,在调用 api 时向其发送类信息。

    public <V> Map<Integer, V> readXML(Map<Integer, V> values, Class<V> clazz) {
        if(clazz == Integer.class) {
            ...
        } else if// or if all the class type has same implementation use the 
                 // || operator in the above if condition only. 
                ...
        //and finally
        else {
            // either throw **IllegalArgument/Unsupported operation** exception
            // for the type 'V' Or handle in any other way you like to implement
        }
    }
    

    最后,IllegalArgument / UnsupportedOperation exception 是未经检查的异常。如果您决定抛出异常,请确保正确记录您的方法。

【讨论】:

  • Class clazz 将在编译时生成原始类型警告。正确的签名应该是public &lt;V&gt; Map&lt;Integer, V&gt; readXML(Map&lt;Integer, V&gt; values, Class&lt;V&gt; clazz)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
相关资源
最近更新 更多