【问题标题】:How to get the class of Map type如何获取 Map 类型的类
【发布时间】:2019-01-25 04:27:30
【问题描述】:

我必须在 new CouchbaseDAO<>(cbClientProvider, new CountryConfigKeyProvider(), class); 行中传递 Map<String, CountryConfig> 的类类型来代替第三个参数中的类。但它不接受它,我试过像Map.classn HashMap.class

private static CouchbaseDAO<CountryConfigKey, Map<String, CountryConfig>> getCountryConfigDAO(
            CouchbaseClientProvider cbClientProvider) {
        return new CouchbaseDAO<>(cbClientProvider, new CountryConfigKeyProvider(), Map.class);
    }

Couchbase 构造函数:

public CouchbaseDAO(CouchbaseClientProvider couchProvider, CouchbaseKeyProvider<K> keyProvider, Class<T> dataClass) {
        this(OBJECT_MAPPER, couchProvider, keyProvider, dataClass, RetryableCouchbaseTask.NO_RETRIES);
    }

【问题讨论】:

  • 不可能。 CouchbaseDAO 是什么?
  • CouchbaseDAO 构造函数是什么样的?
  • 添加了构造函数
  • 如果这是为了杰克逊反序列化,你需要一个TypeReference
  • 您可能已经存在足够长的时间,知道您从未将更多信息放入 cmets。相反,您总是更新您的问题,尤其是当有更多代码出现时。

标签: java generics java-8


【解决方案1】:

首先,您不能在方法/构造函数定义中使用泛型类型而不在类级别或方法级别声明它们。

在您的CouchbaseDAO 构造函数中,您使用的是泛型类型&lt;K&gt;&lt;T&gt;。为此,您应该使用这两种类型声明类CouchbaseDAO。如果您还没有这样做,请在构造函数中声明它,例如

public &lt;K, T&gt; CouchbaseDAO(...) {...}

如果您只是想接受 any 类型,那么您可以跳过泛型类型并使用 通配符 字符 ?

因此,要将Class 类型传递给您的构造函数,您的定义应该是Class&lt;?&gt;NOT Class&lt;T&gt;

CouchbaseKeyProvider&lt;K&gt; 也一样。

【讨论】:

  • 即使它可能是合法的语法(令我惊讶的是)我认为在构造函数中而不是在类级别声明类型参数不是一个好主意;那是代码的味道……那有什么意义?如果类行为与类型(参数)无关,那么在构造时提供一个类型(参数)有什么意义?除非 K 和 T 有一定的相关性,并且这会在构造函数的几个参数之间施加约束,否则没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2017-06-25
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多