Java中泛型方法的特定类型实现
有没有办法为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
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();
}
}
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();
}