【问题标题】:Nested generic types in static method静态方法中的嵌套泛型类型
【发布时间】:2021-06-03 15:27:40
【问题描述】:

我正在寻找解决此问题的方法,我需要构建方法以使其返回 someObject<anotherObject>,我正在考虑构建这样的东西:

public static <T, K> T<K> jsonToObjectType(String json, TypeReference<T<K>> type) {
    // More code
}

但它不能编译,有什么方法可以执行该方法吗?谢谢!

【问题讨论】:

  • 没有任何说明T是什么类型,知道它有泛型类型参数K有什么用?
  • @khelwood 这是个好问题 (^o^)
  • 摆脱K: public static &lt;T&gt; T jsonToObjectType(String json, TypeReference&lt;T&gt; type)。那么如果它允许T 是非泛型的呢?

标签: java generics jackson


【解决方案1】:

public static &lt;T, K&gt; T&lt;K&gt;

您的T 没有界限,也就是说,T 可以是任何东西。可能是String

String 没有泛型,那么T&lt;K&gt; 怎么可能有意义呢?它没有,因此,java 不允许你编译它。

我想你可以设想这样的概念:“T 是某种特定类型,可以是任何东西,只要它有 1 个泛型参数”,但 java 没有这个,而且永远不会,因为那是结构类型和 java 不这样做。

但是,请注意,泛型参数可以是任何类型,特别是包括本身参数化的类型。这是一个简单的例子:

public static <T> T coalesce(T a, T b) {
    return a == null ? b : a;
}

这个方法可以这样使用:

String a = null;
String b = "Hello";

coalesce(a, b).toLowerCase();

给它 2 List&lt;String&gt; 绝对没有问题,此时表达式 coalesce(listA, listB) 将是 List&lt;String&gt; 类型。这只是&lt;T&gt;,而不是&lt;T, K&gt; 的东西。

我不太清楚jsonToObjectType 应该做什么,但假设它应该采用包含 JSON + 一些超级类型令牌的字符串(您可以在网上搜索该术语),这我 99.9% 确定你有,然后只需从其中删除 K,你就会得到你想要的:

public static <T> T jsonToObjectType(String json, TypeReference<T> type) {
   // code here 
}

你可以这样称呼它:

String json = "[\"Hello\", \"World!\"]";
List<String> list = jsonToObjectType(json, new TypeReference<List<String>>() {});

它会在没有警告或错误的情况下编译并且可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2010-10-30
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多