Java 的泛型中 List<? extends Father> ? extends Father这么写有什么用?
时间: 2023-08-31 07:42:02 浏览: 147
### 回答1:
<? extends Father> 这种写法的意思是,List 中可以存放 Father 类及其子类的对象,而 Father 类型的对象则不能存放进去。 这个写法可以让 List 变得更加灵活,可以存放任意 Father 类型及其子类的对象,比如 Father 的子类 Son、GrandSon 等等。
### 回答2:
在Java的泛型中,List<? extends Father>这样写的用途是为了使List能够接受Faher类及其子类的对象。?表示一个不确定的类型,而extends关键字限定了该类型必须是Father类或其子类。
使用List<? extends Father>的好处是能够提供更大的灵活性和可复用性。例如,假设有一个List<? extends Number>的列表,我们可以将其赋值为一个List<Integer>或List<Double>的对象,这样做可以使该列表接受更多不同类型的Number及其子类的对象。
另一个好处是能够实现协变。在Java中,数组是不可协变的,即不能将Integer数组赋值给Number数组。但是,使用List<? extends Father>创建的列表可以实现协变,即可以将List<Father>赋值给List<? extends Father>。这样做的好处是可以在方法参数中接受更多不同类型的Father及其子类的对象。
然而,使用List<? extends Father>也有一些限制。由于不确定具体的类型是Father的哪个子类,只能读取元素,而不能修改或添加元素。因为无法确定具体的类型是什么,所以在编译时期无法确定是否为合法的操作。这是为了保证类型安全和类型一致性。
综上所述,使用List<? extends Father>的好处在于提供了更大的灵活性和可复用性,实现了协变,同时也限制了对元素的修改和添加操作。
阅读全文