泛型技术---Generic

19 篇文章 0 订阅
2 篇文章 0 订阅

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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值