泛型
泛型
-
泛型:是jdk5中引入的新特性,可以在编译阶段约束操作的数据类下,并进行检查
-
泛型的格式:<数据类型>
-
注意:泛型只能支持引用数据类型
package A03Generic; import java.util.ArrayList; import java.util.Iterator; public class Demo01 { public static void main(String[] args) { /* *没有泛型的时候,集合如何存储数据 * 结论 * 如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类型 * 此时可以往集合中日俺家任意的数据 * 带来一个坏处,我们在获取数据包的时候,无法使用他的特有行为(原因是多态的弊端不能放为子类的特有功能) * * 此时推出了泛型,可以在添加数据的时候就把类型统一, * 而且我们在获取数据的时候,也省得强转了,非常的方便 */ //1.创建集合的对象 ArrayList<String> list=new ArrayList<>(); //2.添加数据 //list.add(123); list.add("aaa"); //list.add("zhangsan"); //3.遍历集合获取里面的每一个元素 Iterator<String> it=list.listIterator(); while(it.hasNext()){ String str=it.next(); //多态的弊端是不能访问子类的特有功能 //obj.length(); //str.length(); System.out.println(str); } } } -
泛型的好处:
- 同意数据类型
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段就能确定下来
-
细节:
- 泛型中不能写基本数据类型
- 指定泛型的具体类型后,传递数据,可以传入该类类型或者子类
- 如果不写泛型,默认是object
-
泛型类
- 使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
package A03Generic;
import java.util.Arrays;
public class MyArrayList<E> {
Object[] obj=new Object[10];
int size;
/*
E表示不确定的类型,该类型在类后面已经定义过了
e表示形参的名字,变量名
*/
public boolean add(E e){
obj[size]=e;
size++;
return true;
}
public E get(int index){
return (E) obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
-
使用
package A03Generic; public class Demo02 { public static void main(String[] args) { MyArrayList<String> list = new MyArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); System.out.println(list); MyArrayList<Integer>it=new MyArrayList<>(); it.add(123); it.add(456); it.add(789); int i=it.get(0); System.out.println(i); System.out.println(it); } }
泛型方法:方法中形参类型不确定时,可以使用类名后面定义的泛型
-
形参类型不确定时:
- 1.使用类名后面·定义的泛型(所有方法都能使用)
- 在方法申明上定义自己的泛型(只有本方法能用)
-
package A03Generic; import java.util.ArrayList; /* 定义一个工具类 ListUtil 类中定义一个静态方法addAll,用来添加多个集合的元素 */ public class GenericsDemo03{ public static void main(String[] args) { ArrayList<String> list=new ArrayList<>(); ListUtil.addAll(list,"aaa","bbb","ccc","ddd"); System.out.println(list); ArrayList<Integer> list2=new ArrayList<>(); ListUtil.addAll(list2,1,2,3,4); System.out.println(list2); } } -
package A03Generic; import javax.swing.*; import java.util.ArrayList; public class ListUtil { private ListUtil(){} // 类中定义一个静态方法addAll,用来添加多个集合的元素 /* 参数一:集合 参数二:最后要添加到元素 */ public static<E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){ list.add(e1); list.add(e2); list.add(e3); list.add(e4); } public void show(){ System.out.println("nigulasi"); } }泛型接口
-
package A03Generic; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class MyArrayList2 implements List<String>{ @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public Iterator<String> iterator() { return null; } @Override public Object[] toArray() { return new Object[0]; } @Override public <T> T[] toArray(T[] a) { return null; } @Override public boolean add(String s) { return false; } @Override public boolean remove(Object o) { return false; } @Override public boolean containsAll(Collection<?> c) { return false; } @Override public boolean addAll(Collection<? extends String> c) { return false; } @Override public boolean addAll(int index, Collection<? extends String> c) { return false; } @Override public boolean removeAll(Collection<?> c) { return false; } @Override public boolean retainAll(Collection<?> c) { return false; } @Override public void clear() { } @Override public String get(int index) { return ""; } @Override public String set(int index, String element) { return ""; } package A03Generic; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class MyArrayList3<E> implements List<E> { @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public boolean contains(Object o) { return false; } @Override public Iterator<E> iterator() { return null; } @Override public Object[] toArray() { return new Object[0]; } @Override public <T> T[] toArray(T[] a) { return null; } @Override public boolean add(E e) { return false; } @Override public boolean remove(Object o) { return false; } @Override public boolean containsAll(Collection<?> c) { return false; } @Override public boolean addAll(Collection<? extends E> c) { return false; } @Override public boolean addAll(int index, Collection<? extends E> c) { return false; } @Override public boolean removeAll(Collection<?> c) { return false; } @Override public boolean retainAll(Collection<?> c) { return false; } @Override public void clear() { } @Override public E get(int index) { return null; } @Override public E set(int index, E element) { return null; } @Override public void add(int index, E element) { } @Override public E remove(int index) { return null; } @Override public int indexOf(Object o) { return 0; } @Override public int lastIndexOf(Object o) { return 0; } @Override public ListIterator<E> listIterator() { return null; } @Override public ListIterator<E> listIterator(int index) { return null; } @Override public List<E> subList(int fromIndex, int toIndex) { return List.of(); } } -
package A03Generic; import java.util.ArrayList; public class Demo04 { /* 泛型接口的两种使用方式: 1.实现类给出具体的类型 2.实现类延续泛型,创建实现类对象时再确定类型 */ public static void main(String[] args) { MyArrayList3<String> list = new MyArrayList3<>(); list.add("aaa"); } }
-
泛型的继承和通配符
package A03Generic;
import java.util.ArrayList;
public class Demo05 {
public static void main(String[] args) {
/*
泛型不具备继承性,但是数据具备继承性
*/
//创建集合对象
ArrayList<Ye> list1=new ArrayList<>();
ArrayList<Fu> list2=new ArrayList<>();
ArrayList<Zi> list3=new ArrayList<>();
//调用method方法
//method(list1);
//method(list2);
//method(list3);
list1.add(new Ye());
list1.add(new Fu());
list1.add(new Zi());
}
public static void method(ArrayList<Ye> list){
}
}
class Ye{}
class Fu extends Ye {}
class Zi extends Fu{}
class Student2{}
package A03Generic;
import java.util.ArrayList;
public class Demo06 {
public static void main(String[] args){
/*
*
* 需求:
* 定义一个方法,形参是一个集合,但是集合中的数据类型不确定
*/
//创建集合对象
ArrayList<Ye> list1=new ArrayList<>();
ArrayList<Fu> list2=new ArrayList<>();
ArrayList<Zi> list3=new ArrayList<>();
ArrayList<Student2> list4=new ArrayList<>();
//调用method方法
method(list1);
method(list2);
method(list3);
//method(list4); 报错
}
/*
此时,泛型里面写的时什么类型,那么只能传递什么类型的数据
弊端:
利用泛型方法有一个小弊端,此时他可以接收任意数据的类型Ye Fu ZI Student
希望:本方法虽然不确定类型,但我只希望只能传递Ye Fu Zi
此时,我们可以使用泛型的通配符:
1.?也·可以表示不确定的类型,他可以表示类型的限定
2.?extrends E:表示可以传递E或者E的所有子类类型
3.?super E:表示可以传递E或者E所有的父类类型
应用场景:
1.如果我们再定义类,方法,接口的时候,如果类型不确定,就可以定义泛型类,泛型方法,泛型1接口
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用泛型的通配符
泛型的通配符
1.关键点:可以限定类型的范围
*/
public static void method(ArrayList<? extends Ye> list){
}
}

浙公网安备 33010602011771号