定义和使用含有泛型的接口和泛型通配符
定义和使用含有泛型的接口
含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型
publlc interface Iterator<E>{
E next();
}
第一种方式:
创建接口
public interface GenericInterface<I> { public abstract void method(I i); }
实现类
public class GenericInterfaceImpl implements GenericInterface<String>{ @Override public void method(String s) { System.out.println(s); } }
测试类
public class GenericInterfaceTest { public static void main(String[] args) { //创建GenericInterfaceImpl对象 GenericInterfaceImpl gen = new GenericInterfaceImpl(); gen.method("字符串"); } }
第二种方式:
含有泛型的接口第二种使用方式:接口使用什么泛型,实现类就使用的什么泛型,类跟着接口走就相当于定义了
一个含有泛型的类,创建对象的时候定义泛型的类型
public class GenericInterfaceImpl2<I> implements GenericInterface<I>{ @Override public void method(I i) { System.out.println(i); } }
GenericInterfaceImpl2<Integer> gin = new GenericInterfaceImpl2<>(); gin.method(10); GenericInterfaceImpl2<Double> gin2 = new GenericInterfaceImpl2<>(); gin2.method(2.1);
泛型通配符
当使用泛型类或者接口是,传递的数据中,泛型类型不确定,则可以通过通配符<?>表示。
但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
基本使用
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
使用方式:
不能创建对象使用
只能作为方法的参数使用
当ArrayList集合使用什么数据类型,可以泛型的通配符?来接收数据类型
注意:
泛型没有继承概念的
public static void main(String[] args) { ArrayList<Integer> in = new ArrayList<>(); in.add(1); in.add(2); ArrayList<String> strings = new ArrayList<>(); strings.add("张三");
printArray(in); printArray(strings); } public static void printArray(ArrayList<?> list){ Iterator<?> it = list.iterator(); while (it.hasNext()){ Object o = it.next(); System.out.println(o); } }
通配符高级使用---受限泛型
泛型的上限限定:?extends E 代表使用的泛型只能是E类型的子类/本身
泛型的上限限定:?super E 代表使用的泛型只能是E类型的父类/本身
public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<>(); ArrayList<String> list2 = new ArrayList<>(); ArrayList<Number> list3 = new ArrayList<>(); ArrayList<Object> list4 = new ArrayList<>(); getElement1(list1); getElement1(list2);//报错 getElement1(list3); getElement1(list4);//报错 getElement2(list1);//报错 getElement2(list2);//报错 getElement2(list3); getElement2(list4); } //泛型的上限限定:?extends E 代表使用的泛型只能是E类型的子类/本身 public static void getElement1(Collection<? extends Number> coll){} //泛型的上限限定:?super E 代表使用的泛型只能是E类型的父类/本身 public static void getElement2(Collection<? super Number> coll){}