简短结论:Java 泛型在“编译期”能显著提升类型安全,但不能在“运行期”完全保证安全。它更像是“编译期的类型检查工具”,而不是运行时的绝对安全屏障。
下面分点说明。
List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 编译错误
编译器会阻止明显错误的类型插入,避免了很多 ClassCastException。
没有泛型时:
List list = new ArrayList();
list.add("a");
String s = (String) list.get(0); // 可能出错
有泛型后:
List<String> list = new ArrayList<>();
String s = list.get(0); // 安全
Java 泛型在编译后会被擦除:
List<String> -> List
List<Integer> -> List
运行时并不知道 String 还是 Integer。
List<String> list = new ArrayList<>();
list.getClass()
.getMethod("add", Object.class)
.invoke(list, 123);
System.out.println(list.get(0)); // 123
泛型完全失效。
List<String>[] lists = new List[10]; // 警告
lists[0] = (List<String>) (List<?>) Arrays.asList(1, 2, 3);
运行时无法检查。
List raw = new ArrayList();
raw.add(123);
List<String> strings = raw; // 编译警告
String s = strings.get(0); // 运行时 ClassCastException
List<?> list = new ArrayList<String>();
// list.add("a"); // 不允许
虽然安全,但误用 Object 或原始类型仍可能出问题。
public <T> T unsafeCast(Object o) {
return (T) o; // 编译通过,运行可能炸
}
泛型方法并不能保证转换合法。
Java 泛型保证的是“编译期的类型一致性”,不是“运行期的类型绝对安全”。
如果你愿意,我也可以从 JVM 层面 或 面试角度 再讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。