<1>泛型参数类型限制
(1)
泛型的参数类型只能是类(
class
)类型,而不能是简单类型。
(2)
可以声明多个泛型参数类型,比如
<T, P,Q…>
,同时还可以嵌套泛型,例如:
<List<String>>
(3)
泛型
的参数
类
型可以使用
extends
语
句,例如
<T extends superclass>
。
(4)
泛型的参数类型可以使用
super
语句,例如
< T super childclass>
。
(5)
泛型还可以使用通配符,例如
<? e
xtends ArrayList>
<2>extends 和 super 说明
(1)extends语句
使用extends语句将限制泛型参数的适用范围
。例如:
<T extends collection> ,则表示该泛型参数的使用范围是所有实现了collection接口的calss。如果传入一个<String>则程序编译出错。
(2)super语句
super语句的作用与extends一样,都是限制泛型参数的适用范围
。区别在于,super是限制泛型参数只能是指定该class的上层父类。
例如<T super List>,表示该泛型参数只能是List和List的上层父类。
举例如下:
//Apple Orange 都继承自Fruit类,同时Jonathan是Apple的子类
List<? extends Fruit> list = new ArrayList<Apple>();
//list.add(new Apple());Error
//list.add(new Fruit());Error
List<? super Fruit> list = new ArrayList<Apple>();
list.add(new Apple());//可以
list.add(new Fruit());//可以
List<? extends Fruit> list = new ArrayList<Apple>();
list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的
(要注意 upcast 是自动完成的,反过来是需要强制处理,或者违反规则的)
List<? extends Fruit>
表示list持有的对象是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的子类是没有问题的
分享到:
相关推荐
在Java编程语言中,泛型(Generics)是一种强大的特性,它允许我们在编写代码时指定容器(如集合)可以存储的数据类型。这提高了代码的安全性和效率...通过学习和理解这些示例,你可以更好地掌握Java泛型类的类型识别。
Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误的可能性。泛型的主要优点是可以Reusable Code,让程序员编写更加灵活和可维护的代码。 首先,让我们了解 ...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
尽管如此,由于JVM本身的限制,所有的泛型信息在编译后都会被擦除,因此理解类型擦除的概念对于正确使用Java泛型至关重要。开发者应该注意在创建泛型对象时明确指定类型参数,并理解编译时与运行时的区别,以避免...
- **类型擦除**:Java泛型采用了类型擦除的策略,这意味着在编译期间,泛型信息会被删除,只留下原始的无参数类型,这解决了与Java的向下兼容问题。 - **JDK 5.0引入**:Java 5.0正式引入泛型,使得在编译时期就能...
因此,虽然在编译期间我们能获得类型检查的好处,但在运行时,泛型接口和类的行为与无参数类型版本基本相同。 5. **通配符** 在某些情况下,我们可能不关心类型参数的具体类型,而只关心它是某个类的子类或者实现...
在Java编程语言中,泛型是一种强大的特性,它允许我们在定义类、接口和方法时引入类型参数,从而实现参数化类型。然而,Java的泛型并非像C++...开发者应理解这些补偿机制,以便更好地利用Java泛型进行类型安全的编程。
在调用泛型方法时,Java编译器会根据传入的实际参数类型推断出类型参数的具体类型。例如: ```java int result = sum(10, 20); // 实际类型为 int String combined = sum("Hello ", "World"); // 实际类型为 String...
Java泛型是Java语言中用于处理类型安全的一种机制,它允许在编译期间提供类型检查,并在运行时消除了类型转换。Java泛型深入的内容涵盖泛型的基本概念、泛型类、接口、方法以及泛型的使用限制和高级特性。 首先,...
解析Java泛型的类型擦除 Java 泛型是 Java SE 1.5 的新特性,它们在语法和应用环境上与 C++ 中的模板相似,但是本质上它们之间有着区别,这种区别就在于 Java 泛型的类型擦除。 Java 泛型的类型擦除是 Java 语言...
Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...
6. **基本类型与泛型**:Java泛型不支持原始类型(如int、char)作为类型参数,但可以通过使用专门的通配符如`Integer[]`或`? extends Number`来间接实现。 7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类...
泛型还可以在方法中使用,以限制传入或返回的参数类型。例如,一个函数可能接受两个相同类型的参数并返回它们的和: ```java public <T extends Number> T sum(T num1, T num2) { return num1.add(num2); } ``` ...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。泛型的主要目的是提供类型安全,帮助程序员在编译时发现...在这个"java泛型Demo"中,你将有机会实践这些概念,加深对Java泛型的理解。
通过理解并熟练运用Java泛型,开发者可以编写出更加健壮、类型安全且易于维护的代码,提升软件质量。Java泛型技术的不断发展和完善,也为Java程序员提供了强大的工具来应对复杂的数据处理场景。