面试题答案
一键面试- 不能使用基本数据类型:Java泛型是基于类型擦除实现,运行时泛型类型信息会被擦除,而基本数据类型无法进行类型擦除,所以不能直接用于泛型,如不能写成
List<int>
,只能用其包装类List<Integer>
。 - 无法创建泛型数组:由于类型擦除,运行时无法确切知道泛型的实际类型,因此不能直接创建泛型数组,如
T[] array = new T[10];
是不允许的。虽然可以通过一些方式绕过,如Object[]
再强转,但存在类型安全风险。 - 泛型类的静态上下文中类型参数无效:静态成员属于类本身,而不是类的实例,在静态上下文中,泛型类型参数还未确定,所以不能在静态方法、静态成员变量中使用泛型类型参数,例如不能在泛型类中定义
static T value;
。 - 泛型类型擦除导致运行时类型信息丢失:编译后的字节码中,泛型类型被擦除为其限定类型(通常是Object),在运行时无法获取到具体的泛型类型信息,这使得在运行时根据泛型类型进行复杂逻辑判断变得困难。例如,不能通过
if (obj instanceof List<String>)
这样的语句在运行时判断一个对象是否是特定泛型类型的实例。