Java 泛型不变性引发的类型转换问题及解决方案
文章围绕 Java 中最常见的一类泛型报错展开:为什么 `StudyPoint implements IAdjIniPoint`,却仍然不能把 `List ` 直接当成 `List ` 使用。文中会拆开不变性、`? extends`、`? super` 与 PECS 的实际含义,并补充和 C# 在协变支持上的关键差异。 在 Java 里,`StudyPoint` 实现了 `IAdjIniPoint`,但 `List ` 依然不能赋给 `List `,根因是泛型默认不变。处理这类问题时,先区分读还是写:只读用 `? extends`,只写用 `? super`,需要真正的接口类型列表就用 `new ArrayList(studyPoints)`,如果还在设。








![C# 里的 `?`、`??`、`??=`、`?:`、`?.`、`?[]`,到底该怎么用](https://img.ipython.cn/uploads/20260824/17875716536a8c2dc50ec03135006804.webp)



