深入理解java泛型详解,对java泛型的理解
本文给大家带来了一些java的知识,主要介绍了一些关于泛型的相关问题,包括自定义泛型类、自定义泛型方法、自定义泛型接口等。来看看吧,希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
泛型:是JDK5中引入的一个特性,可以在编译时约束和检查操作的数据类型。泛型的格式:数据类型,注意:泛型只能支持引用数据类型。系统的所有接口和实现类都支持使用泛型。优势:
统一数据类型。将运行问题提前到编译时,避免了强制类型转换的可能问题,因为类型可以在编译时确定。公共静态void main(String[] args) {
ListString list=new ArrayList();
List.add(石原聪美);
List.add(工藤静香);
List.add(朱茵);
for (String s : list) {
system . out . println(s);
}
}
输出结果:
石原聪美
工藤静香
而且朱茵泛型可以在很多地方定义,比如类后的泛型类,方法声明上的泛型方法,接口后的泛型接口。让我们了解一下这些泛型是如何一起使用的:
自定义泛型类
概念
同时定义泛型的类是泛型类。泛型类的格式:修饰符类名泛型变量{}公共类MyArrayListE { }函数:可以在编译阶段指定数据类型,类似于集合的函数
实战教学
现在创建一个泛型类实现基本的添加和删除操作,以便具体了解其用法:
//泛型类MyArrayLIst
公共类MyArrayLIstE {
public void add(E e){
}
public void remove(E e)
}
}
//main
公共静态void main(String[] args) {
MyArrayLIst string list=new MyArrayLIst();
//通过设置泛型,可以独占处理数据。
List.add(石原聪美);
List.add(工藤静香);
list . remove( Shizuka Kudo );
}泛型类的原理:
用传输的实数据类型替换所有出现的泛型变量。
通过仔细观察,其实不难发现,泛型类与普通类最大的区别在于,在调用方法时可以统一处理相同的数据,不会涉及其他数据类型,从而在一定程度上避免了强制类型转换中可能出现的问题。
自定义泛型方法
概念
如果同时定义了一个泛型方法,则定义了一个泛型方法。泛型方法的格式:修饰符泛型变量返回值类型方法名(参数列表){}public E void view(E e){}函数:方法中可以使用泛型来接收实际类型的所有参数,使得方法的通用性更强。注意:泛型方法需要与泛型类中定义的方法不同。虽然他们也在使用泛型,但是泛型不是由他们定义的,而是由泛型类定义的。
实战教学
无论传入什么类型的数组,都可以返回其内容,即实现Arrays.toString()的功能
公共静态void main(String[] args) {
String [] name={ 石原聪美,工藤静香,朱茵 };
视图(名称);
Integer [] age={18,19,20 };
观点(年龄);
}
公共静态T void视图(T[] arr){
StringBuilder list=new StringBuilder();
for(int I=0;长度;i ) {
list.append(arr[i])。追加( \ t );
}
system . out . println(list);
}通过定义泛型方法,可以接收多种数据类型,应用范围更广。
自定义泛型接口
概念
由泛型定义的接口是泛型接口。泛型接口的格式:public interface Peoplee { } public interface Peoplee { }函数:泛型接口允许实现类为当前函数选择需要操作的数据类型
实战教学
定义一个people接口实现教师类和学生类的操作。
//人员界面
公共接口人员E{
无效运行;
空隙高度(E E);
}
//学生类
公共课教师{
}
//实现类Fantype
公共类Fantype实现PeopleTeacher {
@覆盖
公共void run(教师教师){
}
@覆盖
公共空高(教师教师){
}
}通过观察上面的代码可以发现,人之后定义了什么类型,那么实现类只能对这个数据类型进行操作,其他类型不能。
通配符和上下限
通配符
?可以在“使用泛型”的时候代表一切类型E T K V是在定义泛型的时候用的 假设有一个学生和老师的竞赛。要比较谁快,创建一定数量的对象,传入集合。但是,当我们将这两个集合分别传入方法时,会发现学生对象集合list2中有一个错误。为什么?原因是数据类型不同,那么两种类型怎么传入呢?也许有人会说,“既然两个类都是人的子类,为什么不把它的泛型定义为人呢?”这个想法很好,但是我们需要明确一点,子类虽然和父类相关,但是定义之后的集合是不相关的,所以在这里行不通。
//main
//教师对象集合
ArrayList teacher list 1=new ArrayList();
list1.add(新老师());
list1.add(新老师());
PK(list 1);
//学生对象的集合
ArrayList student list 2=new ArrayList();
list2.add(新生());
list2.add(新生());
PK(list 2);//因为pk方法的参数是名为Teacher的泛型集合,所以会报错。
//父类
阶级人民{
}
//子类
班主任延人{
}
班级学生扩展人{
}
//pk方法:
公共静态void PK(ArrayList teacher people){
}要解决这个问题,可以把本文介绍的知识“通配符”放到实际应用中去解决问题。通过它的简短概念”?“使用泛型”时可以表示所有类型。为了理解它的功能,这里我们可以使用“?”一起代表两种类型。
公共静态void pk(ArrayList?人){
//通过通配符?这个问题是可以解决的。
}
上下限
然而就在这个时候,另一个问题出现了。定义了一个dog类,试图创建一些对象,并将它们传递到集合中,以混合到竞争中。当然,这种情况是不允许发生的。然而呢?它可以代表任何类型,而且不能被限制。因此,上限和下限的作用就体现出来了:
上限:扩展父类,传入类型必须是父类或父类子类的下限:超子类,传入类型必须是子类或者子类的父类,public static void pk(ArrayList?扩展人员人员){
//这个问题可以通过上下限来解决。
//要求传入的类型必须是People的子类。
}推荐学习:《java视频教程》以上是一起了解Java中泛型的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。