[英]Specific type implementation for generic method in Java
有没有办法为 Java 方法提供特定于类型的实现?
给定数据 class 如下:
class Message<T> {
String messageId;
T value;
我有一个读取文本格式 (json) 并创建此 class 的实例的方法。 值可以是字符串或 Integer。
class MessageReader {
public <T> Message<T> read(final Json json) {
return Message.<T>build()
.messageId(json.get("id").getAsString())
.value(<T>readValue(json))
.build();
}
// This can not be done since the method to get the value is different for String and Integer
private <T> T readValue(Json json) {
return json.get("value").getAsString() // or .getAsInteger() depending on T
}
// What I would like to do
private <String> String readValue(Json json) {
return json.get("value").getAsString();
}
private <Integer> Integer readValue(Json json) {
return json.get("value").getAsInteger();
}
}
有没有办法在 Java 中实现这一点? (类似于 C++ 功能)
不是这样的。 Java generics are not C++ templates: generics are simply compiler-inserted (and compiler-checked) casts. 如果你不能用演员表自己做某事,你不能用 generics 做。
您必须传入专门用于从输入中提取所需类型的内容,例如
private <T> T readValue(Json json, Function<? super Json, ? extends T> fn) {
return fn.apply(json);
}
你像这样调用:
String str = readValue(json, json -> json.get("value").getAsString());
但是当你不得不写那么多的时候,一个通用的辅助方法并没有为你节省任何东西:
String str = json.get("value").getAsString();
非泛型辅助方法是更好的方法:
private String readValueAsString(Json json) {
return json.get("value").getAsString();
}
private Integer readValueAsInteger(Json json) {
return json.get("value").getAsInteger();
}
当然,您必须选择“正确的名称”。 但我会尝试使用 generics。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.