首页 > 解决方案 > 静态方法中的嵌套泛型类型

问题描述

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

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

但它不编译,有没有办法执行该方法?谢谢!

标签: javagenericsjackson

解决方案


public static <T, K> T<K>

YourT没有界限,意思是,T 可以是任何东西。可能是String

String 没有泛型,那怎么可能T<K>有意义呢?它没有,因此,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<String>,此时表达式coalesce(listA, listB)将是 type List<String>。这只是与<T>,而不是与这些<T, K>东西。

我不太清楚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>>() {});

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


推荐阅读