繁体   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