据我了解,在 Java 中,与 C# 中的泛型相反,泛型是编译时功能,并通过类型擦除来删除。那么,Gson 的TypeToken
真的有效吗?它如何获得对象的泛型类型?
来自 JLS §4.6(强调我的):
类型擦除是从类型(可能包括参数化类型和类型变量)到类型(永远不是参数化类型或类型变量)的映射。我们写|T|用于类型T的擦除。擦除映射定义如下:
参数化类型 (§4.5) G 的擦除是 |G|。
嵌套类型 T.C 的擦除是 |T|.C。
数组类型 T[] 的擦除是 |T|[]。
类型变量(第 4.4 节)的擦除是其最左边界的擦除。
所有其他类型的擦除就是类型本身。
因此,如果您声明一个具有其自身匿名子类的类,它会保留其参数化类型;它没有被删除。因此,请考虑以下代码:
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.HashMap;
public class Erasure<T>
{
public static void main(String...strings) {
Class<?> foo = new Erasure<HashMap<Integer, String>>() {}.getClass();
ParameterizedType t = (ParameterizedType) foo.getGenericSuperclass();
System.out.println(t.getOwnerType());
System.out.println(t.getRawType());
System.out.println(Arrays.toString(t.getActualTypeArguments()));
}
}
这输出:
null
class Erasure
[java.util.HashMap<java.lang.Integer, java.lang.String>]
请注意,您将得到一个ClassCastException
如果由于删除而没有匿名声明该类;超类不会是参数化类型,它会是Object
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)