静态方法中的嵌套泛型类型
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>>() {});
它会在没有警告或错误的情况下进行编译并正常工作。
我正在寻找这个问题的解决方案,我需要构建方法以便它 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>>() {});
它会在没有警告或错误的情况下进行编译并正常工作。