gpt4 book ai didi

java - 将参数化类型作为参数传递给方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:49 27 4
gpt4 key购买 nike

此类来自供应商库:

public class JsonParser {
public <T> T parse(String json, Class<T> type) { ... }
}

这些是我的模型:

public class Video {
@Key
private String title;
public String getTitle() {
return title;
}
}

public class Response<TResult> {
@Key
private TResult result;
public TResult getResult() {
return result;
}
// ...
}

此代码有效:

JsonParser parser = new JsonParser();
String json = "{ \"title\": \"Hello world\" }";
Video video = parser.parse(json, Video.class);

此代码无效:(Response<Video>.class 处的语法错误)

JsonParser parser = new JsonParser();
String json = "{ \"result\" : { \"title\": \"Hello world\" } }";
Response<Video> videoResponse = parser.parse(reader, Response<Video>.class);

此代码有效:

public class VideoResponse extends Response<Video> {
}

...
JsonParser parser = new JsonParser();
String json = "{ \"result\" : { \"title\": \"Hello world\" } }";
Response<Video> videoResponse = parser.parse(reader, VideoResponse.class);

我的问题是:如何通过 Response<Video>类别为 parse方法作为参数而不创建 VideoResponse像那样。 (在我的程序中,有很多类似于 Video 的模型,我不想重复我的代码来创建空类 VideoResponseUserResponseCommentResponseActivityResponse 等)

最佳答案

由于 Java 泛型的实现方式,在大多数情况下泛型信息会在运行时丢失。这些所谓的 reifiable 的异常(exception)之一类型是泛型类的具体扩展。对于您的第一个示例:

public class Video {
@Key
private String title;
public String getTitle() {
return title;
}
}

public class Response<TResult> {
@Key
private TResult result;
public TResult getResult() {
return result;
}
// ...
}

解析器将无法反序列化 result 属性,因为它无法确定它是什么类型(因为此信息在运行时不可用)。基本上,解析器只看到 java.lang.Object,无法确定要实例化以将 JSON 数据拉入的类型。我假设您已经怀疑是这种情况,因此尝试进行此调用:

Response<Video> videoResponse = parser.parse(reader, Response<Video>.class);

在上面的行中,您试图告诉解析器特定的响应是用 Video 参数化的,但不幸的是,Java 没有通用类文字的语法,所以代码没有编译。

在你的第二个例子中:

public class VideoResponse extends Response<Video> {
}

Response<Video> videoResponse = parser.parse(reader, VideoResponse.class);

您已经创建了通用类的具体扩展。对于此类扩展,通用类型信息在运行时可用,因此您的解析器可以确定它需要实例化什么以反序列化您的 JSON 数据。

所有这些都是您实际问题的背景信息:

My question is: How to pass Response class to parse method as parameter without creating VideoResponse like that

您没有提及您使用的是什么 JSON 库,但在大多数流行的库中,反序列化方法都有一个覆盖版本,该版本接受通常称为父类(super class)型 token 的内容。父类(super class)型标记基本上只是一个类的具体扩展,类似于我上面描述的。例如,在 Jackson 中,您可以像这样反序列化 JSON:

Response<Video> response = new ObjectMapper().readValue(
jsonString, // JSON data
new TypeReference<Response<Video>>() {} // super type token, implemented by anonymous class
);

您应该检查您的 JSON 库文档是否有类似的内容。

关于java - 将参数化类型作为参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15595613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com