【发布时间】:2020-11-17 22:17:26
【问题描述】:
我在gson找到了如下源码:
public <T> T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException
{
JsonReader jsonReader = newJsonReader(json);
T object = (T) fromJson(jsonReader, typeOfT);
assertFullConsumption(object, jsonReader);
return object;
}
fromJson 函数声明返回 Object 还是返回 T 是否重要?至少据我所知,如果 T 不能通过函数参数推断出来,它就完全充当对象。 那么为什么源码使用T而不是Object呢?
【问题讨论】:
-
这很重要。它们提供 T 以便可以推断类型。
Foo foo = gson.fromJson(reader, type);如果是 Object,您将不得不自己投射。所以为了方便就这么写了。当然,他们的演员阵容仍然未经检查,因此该方法基本上假设调用者正在分配正确的类型。如果不是,那么他们将得到一个类转换异常。 -
@Michael,他们可以添加哪些检查?
-
这是谷歌的代码。如果有,他们会这样做;)这是类型擦除的结果,并且就编译器而言,返回 T 和参数 Type 是不相关的事实。它们之间的唯一关系是上下文关系。没有什么可以阻止我打电话给
String s = gson.fromJson(reader, TypeOfInteger),这注定会失败 -
@Michael,谢谢。或许你可以看看 xehpuk 例子,试着理解为什么 result2 赋值不会抛出异常?
标签: java object generics wildcard