面试题答案
一键面试1. 非泛型类的类型问题
在非泛型类中,由于可以存储任何类型的对象,可能会在编译期和运行期出现类型相关的问题。
编译期问题
import java.util.ArrayList;
import java.util.List;
public class NonGenericExample {
public static void main(String[] args) {
List list = new ArrayList();
list.add("Hello");
list.add(123); // 编译期不会报错,尽管将不同类型元素添加到列表中
for (Object obj : list) {
String str = (String) obj; // 编译期不会报错,但运行期可能会抛出ClassCastException
System.out.println(str.length());
}
}
}
运行期问题
上述代码在运行时,当试图将 Integer
类型的 123
强制转换为 String
时,会抛出 ClassCastException
,因为运行时发现类型不匹配。
2. 泛型类提供更高类型安全性
编译期安全性
import java.util.ArrayList;
import java.util.List;
public class GenericExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 编译错误,类型不匹配,确保只能添加String类型元素
for (String str : list) {
System.out.println(str.length());
}
}
}
在泛型类中,通过指定类型参数(如 List<String>
),编译器会在编译期检查类型。当试图添加不匹配类型(如 Integer
)时,会产生编译错误,从而在编译阶段就发现潜在的类型问题,避免了运行期的 ClassCastException
。
运行期安全性
由于编译期确保了类型的一致性,运行期无需进行额外的类型检查(如 instanceof
检查),因为泛型类型信息在编译期就已经确定,运行期执行代码更加安全和高效。
综上所述,Java泛型类通过在编译期进行严格的类型检查,避免了在非泛型类中可能出现的编译期和运行期类型错误,从而提供了更高的类型安全性。