簡體   English   中英

Java中泛型方法的具體類型實現

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM