Java 泛型
最近终于期末考试结束了,小林开始了武汉漫长炎热的暑假,趁着暑假想把之前的java基础知识在复习一遍,今天小林复习了泛型,我的天呢,感觉不是在复习,完全是在重新学习,好多都忘了。真是令人汗颜,看来以后要多加复习了
1 .概述
- 它的本质是参数化类型,将类型由原来的具体的类型参数化,然后在使用/调用是传入具体的类型
2. 格式
- <类型>:指定一种类型的格式,这里的类型可以看作是形参
- <类型1,类型2,…>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型可以看作是形参
- 将来调用是给定的类型必须是实参,并且实参的类型只能是引用数据类型
3.泛型的好处
- 把运行期间的问题提前到了编译期间
- 避免了·强制类型转化
4.泛型类
-
格式:修饰符 class 类名<类型>()
-
范例:public class Ceneric()
-
此处的T可以随便写为任喜标识
import javax.xml.crypto.Data; import java.util.ArrayList; import java.util.Date; import java.util.Scanner; /** * The type Test. */ public class test { public static void main(String[] args) { student s=new student(); s.setName("张无忌"); System.out.println(s.getName());//输出 张无忌 Teacher t=new Teacher(); t.setAge(30); System.out.println(t.getAge());//30 // Teacher t=new Teacher(); // t.setAge("30");报错 传入的参数应为int类型 // System.out.println(t.getAge());// Generic<String> g1=new Generic<String>();//T为String类型 g1.setT("张无忌"); System.out.println(g1.getT());//输出 张无忌 Generic<student> g2=new Generic<>();//T为student类型 g2.setT(s); System.out.println(g2.getT().getName());//输出张无忌 } } class Generic<T>{//使用泛型 传入的参数是什么类型则T为什么类型 private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } class student{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } class Teacher{ private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
5.泛型方法
-
格式:修饰符<类型>返回值类型 方法名(类型 变量名){}
-
范例:public void show(T t){}
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class test1 { public static void main(String[] args) { //正常操作 Genrics1 g1=new Genrics1(); g1.show("张无忌");//输出 张无忌 g1.show(30);//输出30 g1.show(true);//输出true //使用泛型类 Genrices2<String> g2=new Genrices2<>(); g2.show("张无忌");//输出 张无忌 Genrices2<Integer> g22=new Genrices2<>(); g22.show(30);//输出 30 Genrices2<Boolean> g222=new Genrices2<>(); g222.show(true);//输出 true //使用泛型方法 Genrices3 g3=new Genrices3(); g3.show("张无忌"); g3.show(30); g3.show(true); } } class Genrics1{ public void show(String s){ System.out.println(s); } public void show(Integer i){ System.out.println(i); } public void show(Boolean b){ System.out.println(b); } } class Genrices2<T>{ public void show(T t){ System.out.println(t); } } class Genrices3{ public<T> void show(T t){ System.out.println(t); } }
-
6.泛型接口
-
格式:修饰符 interface 接口名<类型>()
-
范例:public interface Generic ()
-
首先建立一个Generic的泛型接口
package test3; public interface Generic<T>{ void show(T t); }
-
创建一个类 来继承这个接口
package test3;
public class Genericimp<T> implements Generic<T>{
@Override
public void show(T t){
System.out.println(t);
}
public static void main(String[] args) {
Genericimp<String> stringGenericimp = new Genericimp<String>();
stringGenericimp.show("张无忌");//输出 张无忌
}
}
7.类型通配符
-
为了表示各种泛型List的父类 ,可以使用类型通配符<?>
-
List<?>表示元素类型未知的List,它的元素可以匹配任何的类型
-
这种带通配符的list仅表示它是各种List的父类,并不能把元素添加到其中
-
类型通配符的上限表示:<?extends 类型>
-
类型通配符的下限表示:<?super 类型>
-
package test3; import javax.jnlp.ClipboardService; import java.util.ArrayList; import java.util.List; public class test3{ public static void main(String[] args) { List<?>list1=new ArrayList<Object>(); List<?>list2=new ArrayList<Number>(); List<?>list3=new ArrayList<Integer>(); //List<?extends Number> list4=new ArrayList<Object>();//报错 Object 是Number的上限 List<?extends Number> list5=new ArrayList<Integer>(); //List<?super Number>list6=new ArrayList<Integer>();//报错 Integer是Number的下限 List<?super Number> list7=new ArrayList<Object>(); } }
8.可变参数
-
可变参数又称参数可变,用做方法的形参出现,那么方法的参数个数就是可变的了
-
格式:修饰符 返回值类型 方法名(数据类型…变量名){}
-
范例:public static int sum(int …a){}
-
package test3; import javax.jnlp.ClipboardService; import java.util.ArrayList; import java.util.List; public class test3{ public static int sum(int ...a){ int num=0; for(int i:a){ num=num+i; } return num; } public static void main(String[] args) { System.out.println(sum(1,2,3,4)); } }
-
这里的变量a实际上是一个数组,
-
如果一个方法有多个参数,且包含可变参数,可变参数要放到最后
我如果有什么地方出错,欢迎大家告诉小白。
一起加油!!!