Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中泛型方法的特定类型实现_Java_Generics - Fatal编程技术网

Java中泛型方法的特定类型实现

Java中泛型方法的特定类型实现,java,generics,Java,Generics,有没有办法为Java方法提供特定于类型的实现 给定如下数据类: class Message<T> { String messageId; T value; 类消息{ 字符串messageId; T值; 我有一个读取文本格式(json)并创建此类实例的方法。值可以是字符串或整数 class MessageReader { public <T> Message<T> read(final Json json) { retur

有没有办法为Java方法提供特定于类型的实现

给定如下数据类:

class Message<T> {
   String messageId;
   T value;
类消息{
字符串messageId;
T值;
我有一个读取文本格式(json)并创建此类实例的方法。值可以是字符串或整数

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();
    }
}
class消息阅读器{
公共消息读取(最终Json){
返回消息。build()
.messageId(json.get(“id”).getAsString())
.value(readValue(json))
.build();
}
//由于获取字符串和整数值的方法不同,因此无法执行此操作
私有T readValue(Json){
根据T返回json.get(“value”).getAsString()//或.getAsInteger()
}
//我想做什么
私有字符串readValue(Json){
返回json.get(“value”).getAsString();
}
私有整数读取值(Json){
返回json.get(“value”).getAsInteger();
}
}

(像C++能力之类的东西)

不象这样。java泛型不是C++模板:泛型只是编译器插入的(和编译器检查的)转换。如果不能用Casic自己做一些事情,就不能用泛型来做。

您必须传入专门用于从输入中提取所需类型的内容,例如

private <T> T readValue(Json json, Function<? super Json, ? extends T> fn) {
  return fn.apply(json);
}
但是当你需要写那么多的时候,一个通用的helper方法并没有为你节省任何东西:

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();
}

当然,你必须选择“正确的名字”。但是我会在尝试使用泛型时使用它。

如果调用方无法选择他们想要的类型,那么您的方法就不应该是泛型的。看起来
read
readValue
应该分别返回
消息
对象
。调用方能够选择类型还是不能选择类型,这一点很好.实际上,在我的用例中,调用者需要设置期望的类型,这意味着调用者期望消息或消息之类的东西。(我的用例是一个功能测试,其中收到的消息应该符合期望的类型),因此如果我理解正确,我应该公开两个单独的方法(每种类型一个)例如:
publicmessagereadasString(…)
publicmessagereadasinteger(…)
;不是吗?我想公共部分可以与私有方法共享。这应该可以工作,但如果消息最终被多个类型参数化,它可能无法很好地扩展;无论哪种方式,到目前为止这都不是我的情况,只是好奇而已。谢谢!
private String readValueAsString(Json json) {
    return json.get("value").getAsString();
}
private Integer readValueAsInteger(Json json) {
    return json.get("value").getAsInteger();
}