[英]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.