`
- 浏览:
450067 次
- 性别:
- 来自:
深圳
-
-
- List<? extends Fruit> list = new ArrayList<Apple>();
//list.add(new Apple());
//list.add(new Fruit());
List<? super Fruit> list2 = new ArrayList<Food>();
list2.add(new Apple());
list2.add(new Fruit());
-
-
-
List<? extends Fruit> list = new ArrayList<Apple>();
- list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的
-
List<? extends Fruit>表示上限是Fruit,下面这样的赋值都是合法的
-
List<? extends Fruit> list1 = new ArrayList<Fruit>();
-
List<? extends Fruit> list2 = new ArrayList<Apple>();
-
List<? extends Fruit> list3 = new ArrayList<Jonathan>();
-
如果List<? extends Fruit>支持add方法的方法合法的话
- list1可以add Fruit和所有Fruit的子类
- list2可以add Apple和所有Apple的子类
- list3可以add Jonathan和所有Jonathan的子类
- 这样的话,问题就出现了
-
List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个
- 子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple
-
的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()
- Apple的加入肯定是不行的,如果 如果add Jonathan
-
的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()
-
Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add
-
-
-
而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是 Fruit,所以list中add Fruit或Fruit的子类是没有问题的
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
### 泛型类、通配符的使用及上下限详解 #### 1. 泛型类的概念 在Java中,泛型是一种使代码更加灵活、重用性更强且类型安全的技术。通过使用泛型,我们可以定义类型参数化的类或方法,从而避免了代码重复并且可以在...
- **上限和下限**:可以通过`extends`和`super`关键字指定泛型的上限和下限。例如,`List<? extends Number>`表示该列表可以接受任何`Number`子类型的元素。 - **非原始类型的泛型**:不能使用原始类型如`int`作为...
在定义泛型时,可以指定类型参数的上限或下限,这被称为类型参数的边界。例如: ```java List<? super Number> numbers = new ArrayList(); List<? extends Number> subNumbers = new ArrayList(); ``` `super`...
5. **边界**:在使用通配符时,可以指定一个上限或下限,如`? extends Number`表示类型参数必须是Number或其子类,`? super Integer`表示类型参数必须是Integer或其父类。 6. **类型擦除**:Java的泛型在编译后会...
在处理带有通配符的集合时,了解其上限和下限的比较规则至关重要。例如,`List<? extends Number>` 可以赋值给 `List<? super Integer>`,因为Integer是Number的子类。 9. 类型推断 自Java 7起,编译器支持类型...
3. **边界限制**:可以指定类型参数的上限或下限,例如`List<? extends Number>`表示可以存储Number或其子类的对象。 4. **通配符**:`?`表示任意类型,`? extends T`表示T或T的子类,`? super T`表示T或T的父类。 ...
Java 1.5 泛型是Java编程语言中的一项重要特性,它于2004...通过深入理解泛型的各个方面,包括类型参数、泛型类和方法、边界限制、通配符、类型擦除以及泛型与多态的结合,开发者可以编写出更加高效且易于理解的代码。
此外,还有上限通配符`<? extends SomeType>`和下限通配符`<? super SomeType>`,分别限制了类型参数的范围。 5. 泛型的边界:在定义类型参数时,可以设置一个边界,例如`class Box<T extends Number>{...}`,表示...
上限通配符`<? extends T>`和下限通配符`<? super T>`则限制了可以使用的具体类型范围。 6. **泛型方法**:泛型不仅可以应用于类和接口,还可以定义在方法上。这使得方法可以处理多种类型的参数和返回值,如`public...
在Java中,泛型的相互绑定是指在泛型类或者泛型方法中,一个类型参数与另一个类型参数之间存在某种关联或约束,通常是为了实现更复杂的类型系统或保证数据一致性。 首先,我们需要理解泛型的基本概念。泛型引入了...
在上面的代码示例中,我们可以看到泛型的限定上限和下限的使用。我们定义了一个泛型的限定上限:public static void printColl(Collection<? extends Person> al),这意味着这个方法可以接受Person或者Person的子...
super T`分别表示泛型类型的上限和下限,限制了可以与之交互的类型。 5. **泛型方法**:除了泛型类,还可以定义泛型方法,方法的返回类型和参数列表可以包含类型参数,使得方法具有通用性。 6. **与旧代码交互**...
2. 类型参数约束(Type Bounds):可以指定类型参数的上限或下限,例如`<T extends Number>`表示T必须是Number或其子类。 3. 泛型通配符(Wildcard):如`?`,表示任意类型,但通常会配合extends或super关键字限制...
5. **泛型通配符的上限和下限** - **上限通配符**:`? extends SomeType` 允许任何SomeType或其子类的对象。 - **下限通配符**:`? super SomeType` 允许任何SomeType或其父类的对象。 6. **类型擦除与桥接方法**...
在使用泛型时,我们可以指定一个上限,如`List<? extends Number>`,这表示列表中的元素可以是`Number`或其任何子类。这在处理多种类型的数据时非常有用。 7. 下界通配符: 下界通配符`? super T`用于表示类型...
extends T`(上限边界),和`? super T`(下限边界)。 6. **实际类型的使用**:在使用自定义泛型集合时,我们需要指定具体的类型。例如,如果我们创建一个`CustomList<Integer>`,那么这个列表就只能存储整数。 ...
还有其他类型的通配符,如`<? extends T>`(上限通配符)和`<? super T>`(下限通配符),它们分别用于限制可以添加到列表中的元素类型或可以从列表中读取的类型。 总之,Java泛型通过类型检查和类型安全提供了更...