为什么A-> B不会使List <A> - > List <B>?这不会消除对通配符的需求吗?

yac*_*oob 2 c++ java generics templates covariance

免责声明:我不是专业开发人员,我不打算成为一名专业开发人员.关于Java的阅读书,因为我想尝试Android编程,没有任何以前的Java经验.

我正在读这本书 - 我更喜欢它.我已经阅读了关于泛型类的章节的一部分,到了他们提到通配符的地步,并且感到困惑.

如果B延伸A:

  1. List<B> 不是List<A>(我理解它们完全一样)的子类型
  2. List<? extends B> 是一个子类型 List<? extends A>

后者允许编写接受泛型类型参数的函数 - 例如List<? extends A>.这样的函数会接受任一个List<B>或者一个参数List<A>.

现在,对于我的问题:

以类似于C++(以"模板"风格)的方式实现泛型不是更简单吗?这将使List<B>List<A>两个独立的类型,将预期的方式有关.这也可以简单地在函数中声明你期望参数是类型的List<A>,这样就可以List<B>很好地适应那里.

我猜测不仅仅是"我们讨厌C++,让我们做出与众不同"的背后:)我很可能还不知道什么,这使得通配符成为一个非常有用的工具.你对此有何看法?

编辑:如果你List<X>在答案中提到,请记住使用反引号,以避免<X>被解释为HTML标记.

Lag*_*aer 5

有一个简单的原因.

假设你有一个类型的变量List<A>.假设List<B>确实是一个子类型List<A>.

这意味着当这是合法的:

List<A> a_list;
a_list = new List<B>(); //allowed when List<B> is subtype of list<A>
a_list.add(new A()); // WOAH!
Run Code Online (Sandbox Code Playgroud)

在我说WOAH时,会发生以下情况:您向a_list添加A类型的项目.由于a_list被声明为List<A>,这应该是合法的.但是等一下:a_list指的是某种类型List<B>.

所以现在我们将一个类型A的东西添加到一个列表中,该列表应该只存储类型B的项目,这显然不是我们想要的,因为A不是B的子类!