统一数据类型。将运行问题提前到编译期,可以避免强制类型转换可能出现的问题,因为类型可以在编译阶段确定。
public static void main(String[] args) { 列表列表 = new ArrayList(); list.add("石原里美"); list.add("工藤静香"); list.add("朱印") ; for (String s : list) { System.out.println(s); } }输出结果:石原里美工藤静香朱寅
而且泛型还可以在很多地方定义,比如类后面的泛型类,方法声明就是泛型方法,接口就是泛型接口。接下来,让我们学习如何使用这些泛型:
自定义泛型类概念在定义类时定义了泛型类型的类就是泛型类。泛型类的格式:修饰符 class 类名 { }
public class MyArrayList{ }
功能:可以在编译阶段指定数据类型,类似于集合的功能
现在创建一个泛型类来实现基本的添加和删除操作,以了解其用法的更多信息:
//泛型类MyArrayLIstpublic class MyArrayLIst { public void add(E e){ } public void remove(E e){ }}//mainpublic static void main(String[] args) { MyArrayLIst list = new MyArrayLIst( ) ; //通过设置泛型,实现对数据的具体处理 list.add("石原里美"); list.add("工藤静香"); list.remove("工藤静香"); }
泛型类原理:
将所有出现的通用变量替换为传输的实际数据类型。
通过仔细观察,不难发现泛型类与普通类最大的区别在于,调用方法时可以统一处理相同的数据,而不会涉及到其他数据类型。这在一定程度上避免了强制类型转换时可能出现的问题。
自定义泛型方法概念定义方法时同时定义了泛型方法的方法就是泛型方法。泛型方法的格式:修饰符 返回值类型 方法名(形参列表){ }
public void view(E e){ }
作用:方法中可以使用泛型来接收所有实际类型的参数,方法通用性更强。注意:泛型方法需要与泛型类中定义的方法区分开来。虽然他们也在使用泛型,但是泛型不是他们定义的,而是泛型类定义的。 实践教学
无论传入什么类型的数组,都可以返回其内容,即实现了Arrays.toString()的功能
public static void main(String[] args) { String[] name = {"石原里美","工藤静香","朱银"};视图(名称);整数[]年龄={18,19,20};观点(年龄); } public static void view(T[] arr){ StringBuilder list = new StringBuilder(); for (int i = 0; i < arr.length; i++) { list.append(arr[ i]).append("\t"); } System.out.println(列表); }
通过实现泛型方法的定义,可以接收多种数据类型,应用范围更广。
自定义泛型接口 概念 使用泛型定义的接口就是泛型接口。通用接口的格式:public interface People{ }
公共接口 People { }
功能:通用接口允许实现类选择当前函数需要操作的数据类型实践教学
定义一个People接口,实现对Teacher类、Student类及其他类的操作
//人员接口 public interface People { void run(E e); void height(E e);}//学生班级 public class Teacher {}//实现类 Fantype public class Fantype Implements People { @Override public void run (Teacher Teacher) { } @Override public void height(Teacher Teacher) { } }
通过观察上面的代码,可以发现People后面定义了什么类型,那么实现类只能使用这个数据类型,其他类型则无法进行此操作。
通配符和上限和下限通配符?当“使用泛型”时可以表示所有类型 E T K V 定义泛型时使用
假设有一场学生和老师的比赛。需要比较一下谁更快。创建一定数量的对象并将它们传递到集合中。然而,当我们将这两个集合分别传递到方法中时,我们会发现学生对象集合list2发生了错误。为什么?原因是因为数据类型不同,那么如何传入两种类型呢?也许此时有人会说:“既然这两个类都是People的子类,为什么不将其泛型类型定义为People呢?”这个想法很好,但是我们需要明确子类和父类之间的关系。虽然类是相关的,但定义后的集合是不相关的,所以这是行不通的。
//main//Teacher对象集合ArrayList list1 = new ArrayList();list1.add(new Teacher());list1.add(new Teacher());pk(list1);//Student对象集合ArrayList list2 = new ArrayList();list2.add(new Student());list2.add(new Student());pk(list2);//由于pk方法的形参是泛型Teacher的集合,所以会报错 //父类People{ }//子类Teacher extends People{ }class Studentextends People{ }//pk方法:public static void pk(ArrayList people){}
要处理这个问题,我们可以很简单本文介绍的知识“通配符”可以付诸实际应用来解决问题。其功能可以通过其简短的概念“?在‘使用泛型’时可以表示所有类型”来理解。这里我们可以使用“?”一起表示这两种类型。
public static void pk(ArrayList people){//这个问题可以通过通配符解决吗? }
然而,这时候另一个问题又出现了。我定义了一个狗类,并尝试创建一些对象并将它们传递到集合中以在竞争中混合。当然,这种情况是不允许发生的,但是呢?它可以代表任何类型并且不能被限制。所以上下限的作用就体现出来了:
上限:传入类型必须是父类或父类的子类 下限:传入类型必须是子类或子类的父类
public static void pk(ArrayList people){//这个问题可以通过上下限来解决//传入的类型必须是People的子类}
《java视频教学》