栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

该方法如何推断类型

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

该方法如何推断类型

该方法如何推断类型

<T>

没有。泛型方法不推断其泛型类型-这就是为什么

T
称为 类型参数 的原因。方法的 调用者 提供的类型参数
T
。如果这样做,编译器 可能
会根据方法调用的参数和目标类型的上下文来推断出它。

例如:

Set<String> c = Collections.emptySet();

emptySet
声明类型参数
T
,不带参数,并返回
Set<T>
。在此,编译器推断
T
String
基于目标类型
Set<String>

另一个例子:

Collections.singleton("asdf");

singleton
声明一个类型参数
T
,使用
T
,然后返回
Set<T>
。在这里,没有目标类型,但是编译器推断
T
String
基于参数
"asdf"

但是泛型类型推断只是一种方便。没有它,我们仍然可以使用 类型见证 来显式提供类型参数:

Set<String> c = Collections.<String>emptySet();Collections.<String>singleton("asdf");

这将我们带到您的方法签名:

public <T> void fromJsonArray(String jsonString, Type tToken)

fromJsonArray
声明类型参数
T
,但不返回与类型相关的任何东西
T
或接受与类型有关的参数
T
。在调用时
fromJsonArray
,编译器没有从中进行推断的信息
T
Object
除非使用类型见证,否则其类型参数将默认为其上限。

myObj.<String>fromJsonArray(jsonString, tToken);

但这没关系,因为

<String>
对方法调用或其编译的行为没有影响。
T
是没有意义的*,可以从的声明中删除
fromJsonArray

编译器如何将

fromJson
方法返回的值分配给
list
未指定类型i 的变量?

这是来源

Gson.fromJson(String,Type)

@SuppressWarnings("unchecked")public <T> T fromJson(String json, Type typeOfT) throws JsonParseException {    StringReader reader = new StringReader(json);    T target = (T) fromJson(reader, typeOfT);    return target;}

您可以看到它声明了一个任意类型的参数

T
,并将反序列化的对象强制转换为
T
。这称为 未检查的强制转换
,因为如果出错,它不会快速失败。那是因为在运行时
T
已被擦除。您可以看到代码抑制了这样做的警告,因为通常这是一个坏主意。通过不限制
T
基于方法参数的内容,Gson代码已有效地将其控制权转让给了调用者。如果您写:

List<String> list = g.fromJson(jsonString, tToken);

但用

tToken
表示
HashSet<String>
,您将
ClassCastException
在运行时在该行上得到一个。更糟糕的是,如果
tToken
表示的话
ArrayList<Integer>
,它甚至不会在那条线上失败,因为JVM只会看到
List
并允许分配发生。
ClassCastException
一旦您的代码尝试将列表的
Integer
元素处理为
String
s
,便会在以后的某个时间抛出A (并且此异常会导致调试混乱)。

因此,要回答有关分配的问题,编译器可让您将结果分配给所需的

fromJson
任何对象。正确无误取决于您。

您可能会问, 为什么Gson会进行未经检查的强制转换并允许使用不安全的代码? 答案是由于语言限制,这很方便。他们的其他签名更安全:

public <T> T fromJson(String json, Class<T> classOfT)

但是没有办法用

Class
-
来表示通用类型
List<String>.class
。只有一个
Type
可以做到这一点,它本身并不是通用的。
fromJson
可能需要一个
TypeToken<T>
,但是还有其他方法可以获取
Type
,因此这是限制性的。

返回

Object
并强制调用者进行未经检查的强制转换会更加透明,但是Gson开发人员可能希望避免这种“丑陋”。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/464049.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号