- public class test01 {
- //泛型可以用在方法接口类,泛型的类型只能是引用类型而不是基本类型
- public static void main(String[] args) {
- ArrayList<Object> ob = new ArrayList<>();
- //new 集合没有指定泛型 存放的类型是object,
- //集合的迭代器
- ArrayList strings = new ArrayList<>();
- strings.add("m1");
- strings.add("s1");
- strings.add("c1");
- strings.add(12);
- Iterator myiterator=strings.iterator();
- while(myiterator.hasNext())
- {
- //如果取出stirngs 的存放类型,会发现object类型
- //为了避免类型转换异常,要先对类型进行判断
- Object next = myiterator.next();//自动补全ctrl+aalt+v
- if (next instanceof String)//类型匹配instanceof
- {
- String str=(String)next;//强制转换
- System.out.println(str);
- }
- if(next instanceof Integer)
- {
- int a=(Integer) next;
- System.out.println(a);
- }
- // String str=(String)myiterator.next();//做个强转
- //String str=myiterator.next();//直接转会报错,因为存储的是object
- // System.out.println(myiterator.next());一般形式下这样遍历
- // System.out.println(str);//12会报错,因为Integer类型不能强转成Stirng
- }
- }
- }
泛型类,泛型接口都是在类名,接口名后尖括号
泛型方法在返回类型前尖括号 public
--------------------------------------------------------------------------
泛型类,类中的成员属性T 类上定义的泛型类型相同

- public class mayikt <T>{
- private T t;
-
- public T getT() {
- return t;
- }
-
- public void setT(T t) {
- this.t = t;
- }
- }//泛型类,在类中定义的成员属性 T 和类上定义的泛型是同一个
这样,创建mayikt类的不同对象,每个对象使用的类型T是不一样的,每个对象的成员方法所用的泛型也是独特的
- public class test02 {
- public static void main(String[] args) {
- mayikt<String> str=new mayikt<>();//str是mayikt类的一个对象,使用的泛型String
- str.setT("Q");
- System.out.println(str.getT());
- mayikt<Integer> interger=new mayikt<>();//integer是同一类的另一个对象,使用的泛型Integer
- interger.setT(12);
- System.out.println(interger.getT());
- mayikt ob=new mayikt<>();//有尖括号就算使用泛型,但没规定泛型种类默认Object,是所有引用类型的父类
- ob.setT("1122");
- ob.setT(1222);
- }
- }
---------------------------------------------------------------------------------------------------------------------------------
泛型方法,可以用一个类型的同一个对象,但是 方法 的 参数的泛型 和 方法的泛型是一一对应的

- public class meite {
- public
T show(T t) - {
- return t;
- }
- //泛型方法,同一对象,传的参数泛型不同,可以用ctrl+alt+v自动补全来验证
- }
- public class test03 {
- public static void main(String[] args) {
- meite m=new meite();
- System.out.println(m.show("aaa"));//
String show(String str) - System.out.println(m.show(12));
- /*
- 快捷键ctrl+alt+v//自动识别返回类型integer,并用show接收
- */
- Integer show = m.show(13);
- Double show1 = m.show(12.3);
----------------------------------------------------------------------------------------------------------------
泛型接口
接口规定泛型,继承接口的类也会使用此泛型

用到了两个泛型,show方法的泛型M 类的泛型T,方法返回值类型T

- public interface Maiyiinterface
{ - T show(T t);
- }
-
-
-
- public class MaiyiIMPL
implements Maiyiinterface{ - @Override
- public T show(T t) {
- return t;
- }
- }
-
-
-
- public class test03 {
- public static void main(String[] args) {
- //泛型接口
- MaiyiIMPL<String> stringMaiyiIMPL = new MaiyiIMPL<>();
- stringMaiyiIMPL.show("a");
- MaiyiIMPL<Integer> integerMaiyiIMPL = new MaiyiIMPL<>();
- integerMaiyiIMPL.show(12);}
- }
-----------------------------------------------------------------------------------------------------------
可变参数 String...a,范型底层擦除机制
可变参数是基于数组实现的
- package first.day01;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- public class test04 {
- public static void main(String[] args) {
- System.out.println(sum(1,1,1));
- //int...a 可变参数是基于数组实现a[0]=1,a[1]=1...
- //因为数组长度不能确定,所以有别的参数时把可变参数往往放最后
- sum2(0,1,1);
- Arrays.asList();//ctrl+shift+i 进入源码,发现用的就是可变参数,传入一些参数,返回一个集合
- List
strings = Arrays.asList("a", "x", "v");//List xxx这样接住 - //但是使用arrays.aslist创建的集合是不能进行添加和删除的,因为创建完了·集合元素个数是不能改变的,不过可以进行修改
- strings.set(0,"m");//输出[m,x,v]
- System.out.println(strings);//直接把集合输出,不会输出地址
- ArrayList
strings1 = new ArrayList<>(); - List newlist=strings1;//不要用尖括号,即使是object类型也已经使用泛型了,不可以
- newlist.add(12);//泛型底层的擦除机制,把使用泛型的集合整个付给没使用泛型的集合,泛型就会被擦出,add时不会限制传递类型
- /*
- 泛型是在编译阶段限制传递的类型 在运行阶段都是擦除
- 底层·class文件 在运行时是 没有使用泛型的
- 如何证明:run一下,在out文件夹里拖进xjad反编译发现没用泛型
- */
- }
- public static int sum(int ...a) {
- int s = 0;
- for (int i = 0; i < a.length; i++) {
- s = s + a[i];
- }
- return s;
- }
- public static void sum2(int b,int ...a)
- {
- System.out.println("不参与运算"+b);
- for(int i:a)//证实a是个数组形式存储的
- {
- System.out.println(i);
- }
- }
- }
- public class xjad {
- public static void main(String[] args) {
- ArrayList<String> sr=new ArrayList<>();
- List l=sr;
- l.add(12);//run后在out找到拖进xjad反编译发现源码根本没用到泛型,这时l的泛型类型object
- }
- }


----------------------------------------------------------------------
类型通配符

类型通配符不能add 因为还没限制操作的泛型类型,一般用于接收,剩下的操作用if条件句自己编
带通配符的可以get操作,得到的类型是object
- public class test03 {
- public static void printlist(ArrayList> thelist)
- {
- Object o = thelist.get(0);
- }
- public static void main(String[] args) {
- ArrayList<String> str=new ArrayList<String>();
- ArrayList<Integer> integers = new ArrayList<>();
- printlist(str);