1. 父类引用调用时不报错,通常是因为父类方法参数用的是原始类型或通配符,类型检查被放宽。 2. 子类引用调用时,IDEA能精确推断泛型类型,类型不匹配就会报错。 这种代码很糟糕,带到线上环境无法通过日志排查出来 import java.util.*; class GenericClass { public void method(List list) { System.out.println("Method called with: " + list); } } class SubClass extends GenericClass { // 继承了 GenericClass } public class Test { public static void main(String[] args) { List intList = Arrays.asList(1, 2, 3); // 情况1:使用原始类型 - 不报错,只有警告 GenericClass rawType = new SubClass(); rawType.method(intList); // 编译通过,但有 unchecked 警告 // 情况2:使用参数化类型 - 报错 SubClass parameterizedType = new SubClass(); // parameterizedType.method(intList); // 编译错误! // 正确的调用 List stringList = Arrays.asList("a", "b", "c"); parameterizedType.method(stringList); // 正确 } } 为什么会这样:原始类型的特殊行为 Java语言规范中的原始类型规则 根据Java语言规范(JLS §4.8),当你使用原始类型(Raw Type)时: 1. 所有泛型类型检查都被关闭 2. 编译器只发出 unchecked 警告,不报编译错误 3. 所有泛型参数都被视为 Object 术语 中文含义 举例 所在条目 Parameterized type 参数化类型 List 条目 26 Actual type parameter 实际类型参数 String 条目 26 Generic type 泛型类型 List 条目 26 Formal type parameter 形式类型参数 E 条目 26 Unbounded wildcard type 无限制通配符类型 List 条目 26 Raw type 原始类型 List 条目 26 Bounded type parameter 限制类型参数 条目 29 Recursive type bound 递归类型限制 > 条目 30 Bounded wildcard type 限制通配符类型 List 条目 31 Generic method 泛型方法 static List asList(E[] a) 条目 30 Type token 类型令牌 String.class 条目 33

视频信息