Generic
- 泛型的好处:1、保证安全性(将运行期错误转到编译期);2、省去强转的麻烦
- 泛型的基本使用:<>中必须是引用数据类型(基本数据类型有包装类)
- 注意事项:前后必须一致,或者后面省略(1.7新特性),泛型不要指定为Object没有意义
public class Demo {
public static void main(String[] agrs) {
ArrayList<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
Iterator<String> ite = list.iterator();
for(ite.hasNext()) {
System.out.println(ite.next());
}
}
}
public class Demo {
public static void main(String[] agrs) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
Iterator<Person> ite = list.iterator();
while(ite.hasNext()) {
Person p = ite.next();
System.out.println("姓名 : " + p.getName() + "、年龄 : " + p.getAge());
}
}
}
泛型类的使用
class Tool<E> {
private E name;
public Tool(E name) {
this.name = name;
}
public void setName(E name) {
this.name = name;
}
public E getName() {
return this.name;
}
}
- 集合存储字符串和自定义对象的并遍历泛型
//字符串
public class Demo {
public static void main(String[] agrs) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
//自定义对象
public class Demo() {
public static void main(String[] agrs) {
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("李超武", 24));
list.add(new Student("陈清香", 25));
list.add(new Stdeunt("陈李朋", 26));
Iterator<Student> it = list.iterator();
while(it.hasNext()) {
Student stu = it.next();
System.out.println("学生姓名: " + stu.getName() + " 学生年龄: " + stu.getAge());
}
}
}
- 泛型的安全警告:在泛型应用中最好在声明类的时候指定好其内部的数据类型,例如:“Info”,但也可以不指定类型,但会出现不安全警告,类型默认将变成Object
泛型方法的使用
-
静态方法必须要声明自己的泛型
-
泛型方法与所在的类是否是泛型无关
-
简单的使用
class Demo {
//可以接收任意类型的数据
public <T> T fun(T t) {
return t;
}
}
- 泛型方法返回泛型类的实例(使用上限)
public class Demo {
public static void main(String[] agrs) {
Info<Integer> i1 = fun(100);
Info<Float> i2 = fun(10.2f);
Info<boolean> i3 = fun(true);
System.out.println("内容1: " + i1 + "、内容2: " + i2 + "内容3: " + i3);
}
public static <T extends Number> Info<T> fun(T temp) {
Info<T> newInfo = new Info<>();
newInfo.setVar(temp);
return newInfo;
}
}
class Info<T extends Number> {
private T var;
public void settVar(T var) {
this.var = var;
}
public T getVar() {
return this.var;
}
public String toString() {
return this.var.toString();
}
}
泛型接口的使用
interface Inter<T> {
public void show(T t);
}
class Demo<T> implements Inter<T> {
public void show(T t) {
System.out.println(t);
}
}
public class Demo_Generic {
public static void main(String[] agrs) {
Demo<String> d = new Demo<String>();
d.show("123");
}
}
通配符<?>
public class Demo {
public static void main(String[] agrs) {
Info<String> info = new Info<String>();
info.setVar("LCW");
}
public static void fun(Info<?> info) { //通配符
System.out.println(info.getVar());
//使用通配符只能获取,不能进行修改
}
}
class Info<T> {
private T var;
public void setVar(T var) {
this.var = var;
}
public T getVar() {
return this.var;
}
public String toString() {
return this.var.toString();
}
}
受限泛型
-
设置上限
声明对象:类名称<? extends 类> 对象名
定义类: [访问权限] class 类名称<泛型标识 extends 类>{} -
设置下限: 类名称<? super 类> 对象名
定义类: [访问权限] class 类名称<泛型标识 super 类>{} -
使用问号可以接收任意泛型对象
通过泛型方法返回泛型类的实例
class Info<T extends Number> {
private T var;
public Info() {};
public Info(T var) {
this.var = var;
}
public void setVar(T var) {
this.var = var;
}
public T getVar() {
return this.var;
}
public String toString() {
return this.var.toString();
}
}
public class Demo {
public static void main(String[] agrs) {
}
public static <T extends Number> Info<T> getNew(T value) {
Info<T> temp = new Info<T>(value);
return temp;
}
}
泛型数组
public class Demo12_Generic {
public static void main(String[] agrs) {
Integer[] i = fun(1,2,3,4,5,6); //返回泛型数组
prinArray(i);
}
public static<T> T[] fun(T...array) { //接收可变参数
return array; //返回泛型数组
}
public static<T> void prinArray(T[] array) {
//输出泛型数组
System.out.println("数据: ");
for(T t : array) {
System.out.print(t + "、");
}
}
}
泛型的嵌套设置
public class Demo {
public static void main(String[] agrs) {
Test<Info<String,String>> t = null;
Info<String,String> info = new Info<String,String>("加","油");
t = new Test<Info<String,String>>(info);
System.out.println("内容1: " + t.getInfo().getVar());
System.out.println("内容2: " + t.getInfo().getKey());
}
}
class Info<K,V> {
private K key;
private V var;
public Info(K key, V var) {
this.key = key;
this.var = var;
}
public void setKey(K key) {
this.key = key;
}
public void setVar(V var) {
this.var = var;
}
public V getVar() {
return this.var;
}
public K getKey() {
return this.key;
}
public String toString() {
return this.var.toString() + this.key.toString();
}
}
class Test<W> {
private W info;
public Test(W info) {
this.info = info;
}
public void setInfo(W info) {
this.info = info;
}
public W getInfo() {
return this.info;
}
public String toString() {
return this.info;
}
}
标识接口的使用
public class Demo14_Generic {
public static void main(String[] agrs) {
Person<Introduction> lcw = new Person<>(new Introduction("李超武", "男", 19));
System.out.println(lcw);
Person<Contact> cqx = new Person<>(new Contact("湖南","15074762880", "5201314"));
System.out.println(cqx);
}
}
interface QQ { //所有实现此接口的子类都可以表示信息
//此接口定义完成,但是在此接口中没有任何方法,所有此时,这样的方法称为标识接口。
}
class Contact implements QQ {
private String address; //联系地址
private String telphone; //联系电话
private String zipcode; //邮政编码
public Contact(String address, String telphone, String zipcode) {
this.address = address;
this.telphone = telphone;
this.zipcode = zipcode;
}
public void setAddress(String address) {
this.address = address;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress() {
return this.address;
}
public String getTelphone() {
return this.telphone;
}
public String getZipcode() {
return this.zipcode;
}
public String toString() {
return "联系方式: " + "\n"
+ "\t|- 联系地址 : " + this.address + "\n"
+ "\t|- 联系电话 : " + this.telphone + "\n"
+ "\t|- 邮政编码 : " + this.zipcode + "\n";
}
}
class Introduction implements QQ {
private String name;
private String sex;
private int age;
public Introduction(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public String getSex() {
return this.sex;
}
public int getAge() {
return this.age;
}
public String toString() {
return "基本信息: " + "\n"
+ "\t|- 姓名 : " + this.name + "\n"
+ "\t|- 年龄 : " + this.age + "\n"
+ "\t|- 性别 : " + this.sex + "\n";
}
}
//人的信息最高到Info
class Person<T extends QQ> {
private T info;
public Person(T info) {
this.info = info;
}
public void setInfo(T info) {
this.info = info;
}
public T getInfo() {
return this.info;
}
public String toString() {
return this.info.toString();
}
}