泛型通配符与泛型的使用总结
泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。此时只能接受数据,不能往该集合中存储数据。
通配符高级使用----受限泛型
之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛的上限和下限。
泛型的上限︰
·格式︰类型名称<? extends类〉对象名称。意义︰只能接收该类型及其子类
泛型的下限︰
·格式︰类型名称<? super类〉对象名称。意义︰只能接收该类型及其父类型
第一种
package Generic01_Demo01; import java.util.ArrayList; import java.util.Iterator; /* 泛型的通配符: ?:代表任意的数据类型 使用方式: 不能创建对象使用 只能作为方法的参数使用 */ public class Demo05Generic { public static void main(String[] args) { ArrayList<Integer> listpro = new ArrayList<>(); listpro.add(1); listpro.add(2); ArrayList<String> listmax = new ArrayList<>(); listmax.add("a"); listmax.add("b"); printArray(listpro); printArray(listmax); } /* 定义一个方法,能遍历所有类型的ArrayList集合 这时候我们不知道ArrayList集合使用什么数据类型,可以泛型的通配符?来接收数据类型 */ public static void printArray(ArrayList<?> list){ //使用迭代器遍历集合 Iterator<?> iterator = list.iterator(); while (iterator.hasNext()){ //it.next()方法,取出的元素是object,可以接收任意的数据类型 Object next = iterator.next(); System.out.println(next); } } }
第二种
package Generic01_Demo01; import java.util.ArrayList; import java.util.Collection; /* 泛型的上限限定:? extends E代表使用的泛型只能是E类型的子类/本身 泛型的下限限定:? super E代表使用的泛型只能是E类型的父类/本身 */ public class Demo06Generic { public static void main(String[] args) { Collection<Integer> list1 = new ArrayList<>(); Collection<String> list2 = new ArrayList<>(); Collection<Number> list3 = new ArrayList<>(); Collection<Object> list4 = new ArrayList<>(); getElement1(list1); //getElement1(list2); 报错 getElement1(list3); //getElement1(list4); 报错 getElement2(list1); //getElement2(list2); 报错 getElement2(list3); //getElement2(list4); 报错 /* 类与类之间的继承关系 Integer extends Number extends Object String extends object */ } //泛型的上限∶此时的泛型?,必须是Number类型或者Number类型的子类 public static void getElement1(Collection<?extends Number>coll){} //泛型的下限∶此时的泛型?,必须是Number类型或者Number类型的父类 public static void getElement2(Collection<?extends Number>coll){} }
泛型的使用
1.泛型类和泛型方法
类名<泛型>
方法名(泛型)
package Generic01_Demo01; public class MyClass<T> { public void print(T t){ System.out.println(t); } }
package Generic01_Demo01; public class Test01 { public static void main(String[] args) { MyClass<String> myClass1 = new MyClass<>(); myClass1.print("Hello"); MyClass<Integer> myClass2 = new MyClass<>(); myClass2.print(50); } }
⒉泛型接口和泛型方法
接口名<泛型>
方法名(泛型)
package Generic01_Demo01; public interface Myinter<O> { public abstract void print(O o); }
package Generic01_Demo01; public class MyinterlmoI<O> implements Myinter<O> { @Override public void print(O o) { System.out.println(o); } }
{ public static void main(String[] args) { MyClass<String> myClass1 = new MyClass<>(); myClass1.print("Hello"); MyClass<Integer> myClass2 = new MyClass<>(); myClass2.print(50); System.out.println("**************************"); MyinterlmoI<String> myinterlmoI = new MyinterlmoI<>(); myinterlmoI.print("World"); MyinterlmoI<Double> objectMyinterlmoI = new MyinterlmoI<>(); objectMyinterlmoI.print(5.5); } }
3.泛型通配符
package Generic01_Demo01; import java.util.ArrayList; public class Test02 { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("Hello"); list1.add("World"); list1.add("Java"); ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(20); list.add(30); } public static void print(ArrayList<?> list){ for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }