行业知识
Java---泛型详解
泛型
在���习集合的时候,集合可以存放任意对象,只要把对象存储到集合后,他们都会被提升到Object类型,在我们取出每一个对象,并进行相应操作时,就必须采用类型转换。而在转换的时候就容易产生类型转换异常。为了解决这个问题,就使用了泛型。
()泛型定义与使用
让一个集合只存储同一数据类型
1.定义泛型类
()(1) 定义格式:
修饰符 class 类名 { }
//API中ArrayList集合class ArrayList{ public boolean add(E e){ } public E get(int index){ } ....} (2) 什么时候确定泛型
在创建对象的时候确定泛型
ArrayList list = new ArrayList();
这时候API中的ArrayList就可以理解为
class ArrayList{ public boolean add(String e){ } public String get(int index){ } ...} 总之,就是我们在创建对象的时候传入什么类型,我们的类就是什么类型。
2.定义泛型方法
(1) 定义格式:
修饰符 返回值类型 方法名(参数){ }
public class Test { public void show(E e) { System.out.println(e.getClass()); } public E show1(E e) { return e; }} (2) 什么时候确定泛型
在方法调用时,确定泛型的类型
public static void main(String[] args) { // 创建对象 Test t = new Test(); t.show("raaa");//class java.lang.String t.show(123);//class java.lang.Integer String t1=t.show1("bbb");//bbb } (3) 泛型方法的泛型可以和泛型类中的泛型通用吗?
public class Test { public void show(E e) { System.out.println(e.getClass()); } public E show1(E e) { return e; }} 泛型方法的泛型可以使用泛型类的泛型,也可以不使用,不使用的话就把E换成别的字母就可以了,而且不会影响泛型方法确定泛型的时机
(4) 静态方法可以使用当前类的泛型吗?
public class Test { public static void show(E e) { System.out.println(e.getClass()); } //普通静态方法不能使用当前类的泛型public static void show(E e) { System.out.println(e.getClass()); }} 静态方法中可以使用当前类的泛型,前提条件是当前类必须是泛型方法,因为他确定泛型的时机与类没有关系,只和方法调用的时候有关系。如果是普通静态方法则不能使用当前类的泛型,因为这个时候对象还没有创建出来
3.含有泛型的接口
(1) 定义格式:
修饰符 interface接口名 { }
(2) 什么时候确定泛型
public interface TestInterface{public abstract void add(E e);public abstract E getE(); } ①确定类时确定泛型的类型
public class Imp1 implements TestInterface {@Override//此时泛型的类型就是String类型 public void add(String e) { // 省略... }@Overridepublic String getE() {return null;}} ②确定类时不确定泛型的类型,直到创建对象的时候确定泛型。这时要求当前的类必须是一个泛型类,因为当泛型类在被创建的时候,间接的确定了接口中的泛型。
public class Imp1 implements TestInterface {@Override public void test(E e) { System.out.println(e.getClass()); }@Overridepublic E getE() {return null;}} 4.泛型通配符
1.当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身的方法无法使用。
2.通配符的基本使用:
①不知道使用什么类型来接收数据的时候,此时可以使用?,?表示未知通配符此时只能接受数据,不能往该集合中存储数据。
public static void main(String[] args) { Collection list1 = new ArrayList(); Test(list1); Collection list2 = new ArrayList(); Test(list2);}//定义一个方法用于接受任意单列集合的任何数据类型作为参数传递public static void Test(Collection c){} ②通配符高级使用-----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,Java的泛型中还可以指定一个泛型的上限和下限
泛型的上限:
格式:类型名称
上一篇:web怎么搭建临时静态服务器?
下一篇:服务器太卡怎么登陆?