“在每个可能存在正确类型对应的地方都应该允许进行转换。”在这种情况下,不可能有正确的类型对应。
一个对象永远不能同时是List<A> 和List<B> 的实例,如果A 和B 是具体的并且不相同,即使A 是B 的子类型或其他什么。例如,您不能拥有一个既是 List<String> 又是 List<Object> 的对象。每个对象都有(概念上)一个特定的类型参数。你必须先了解这部分。
你的例子是一样的——List<Pair<F, S>> 和List<Pair<?, ?>>。出于与上面的 String 和 Object 相同的原因,List<Pair<?, ?>> 类型的对象永远不能同时是 List<Pair<F, S>>。
更新:如果有帮助,请提供更多解释。 @Konstantin:如果你写Pair<?, ?>,那么顶层的类型参数?(通配符)是灵活的。 Pair<T1, T2> 与 Pair<?, ?> 兼容。但是,在List<Pair<?, ?>> 中,? 不在顶层。顶层的类型参数是Pair<?, ?>,它不是通配符,因此不灵活。碰巧有? 并不重要。如果你有List<? extends Pair<?, ?>>,那么顶层是一个通配符,并且是灵活的。
您可能想要的是List<? extends Pair<?, ?>>。也许它会帮助您考虑List<Pair<?, ?>> 和List<? extends Pair<?, ?>> 之间的区别。 List<Pair<?, ?>> 表示这是一个 List,它的类型参数 完全 是 Pair<?, ?> 类型(没有别的,不是 Pair<T1, T2> 等)。 List<? extends Pair<?, ?>> 表示这是一个 List,它的类型参数是 Pair<?, ?> 的子类型(包括 Pair<T1, T2>)。