静态方法中的嵌套泛型类型

Nested generic types in static method

我正在寻找这个问题的解决方案,我需要构建方法以便它 returns someObject<anotherObject>,我正在考虑构建这样的东西:

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

但是编译不通过,请问有什么方法可以执行该方法吗?谢谢!

public static <T, K> T<K>

你的T没有界限,也就是说,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) 的类型将是 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>>() {});

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