【问题标题】:Pass a generic class in method parameter在方法参数中传递泛型类
【发布时间】:2020-07-23 17:44:17
【问题描述】:

我有一个方法,它接受两个值并将其转换为映射的键值对并将其返回给调用方法。键始终是字符串,但值可以是任何类。在接受方法签名时,我似乎无法将值转换为泛型。这是我的代码:

private Map<String, Class<T>> mapBuilder(String key, T value) {
        Map<String, Class <T>> map = new HashMap<>();
        map.put(key, value);
        return map;
    }

有人能告诉我可以做什么吗?

【问题讨论】:

  • 为什么不使用String key, Class&lt;T&gt; value作为方法参数,并在将参数传递给方法之前调用该方法调用.class

标签: java generics hashmap


【解决方案1】:

Class 太多了。 T 已经引用了类型:

private <T> Map<String, T> mapBuilder(String key, T value) {
   Map<String, T> map = new HashMap<>();
   map.put(key, value);
   return map;
}

Class&lt;T&gt; 将引用 T 的类对象

【讨论】:

    【解决方案2】:

    您确定要使用Class 作为值的地图吗?如果是这样,您首先要在类级别(public class MyClass &lt;T&gt; { ... } 或方法级别)定义一个泛型类型参数 &lt;T&gt;

    private <T> Map<String, Class<T>> mapBuilder(String key, T value) {
        Map<String, Class <T>> map = new HashMap<>();
        map.put(key, (Class<T>) value.getClass());
        return map;
    }
    

    注意以下几点:

    • 只要要将Class&lt;T&gt;的实例作为值添加到地图中,就必须从T对象中获取。
    • 只要getClass返回Class&lt;?&gt;,就存在类型不兼容的问题,因此需要显式转换(也在上面的sn-p中)。

    最后,我更喜欢带有通配符参数的解决方案:

    private Map<String, Class<?>> mapBuilder(String key, T value) {
        Map<String, Class <?>> map = new HashMap<>();
        map.put(key, value.getClass());
        return map;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2013-07-17
      相关资源
      最近更新 更多