【发布时间】:2021-07-03 02:06:44
【问题描述】:
我正在尝试创建如下方法:
public <T> T getInstance(String key) {
Type type = new TypeToken<T>(){}.getType();
return deserialize(key, type); }
就我没有在return 语句中强制转换(T) 而言,我希望编译器能够从外部上下文或至少从像这里这样的类型见证推断类型:
Integer i = container.<Integer>getInstance(mKey);
但在某些情况下,getInstance() 方法返回从未提及的Double(更准确地说,序列化和反序列化使用的是google的Gson库,初始对象是Integer的实例) .因此,我得到ClassCastException。
那么在这种情况下类型推断究竟是如何工作的,为什么类型见证不起作用?是否可以在不指定 Class<T>.class 作为参数的情况下从外部上下文推断类型?
阐述:
经过一番研究,this FAQ 帮助我更好地理解了这个主题。
【问题讨论】:
-
这根本行不通。由于擦除,您无法使用类型变量创建类型标记。
-
@Andy Turner 很好,该方法可以编译。唯一的问题是错误的返回类型。此外,我看到使用其他程序员的泛型类型创建 TypeToken。
-
我不是说它不编译,我是说它不work;至少,正如您所发现的那样,它不起作用。我应该更准确地说你不能使用类型变量创建类型标记并期望它捕获类型变量以外的任何东西。查看this demonstration:“String”类型标记的“类型”与“Integer”类型标记相同,因为它们捕获的是类型变量,而不是调用站点类型。
-
@Andy Turner 好的,我明白了,这是有道理的。谢谢。
标签: java generics type-inference