Java学习笔记11-泛型

1、简介

        Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。即:参数化类型

2、作用

  • 泛化:用T代表任意类型(参数化类型)。
  • 类型安全:通过泛型变量类型限制,可以在更高程度上验证类型假设。如果不用泛型,则必须使用强制类型转换,而强制类型转换不安全。
  • 消除强制类型转换:泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。
  • 向后兼容性:支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(Generics Java程序),现在很少用。

3、实现

泛型类

概念:如果定义的一个类有一个或多个类型变量,则可以使用泛型。
语法:public class A{}

public class Text {
	public static void main(String[] args) {
		
		A<String> a=new A<String>();//在new A的对象指定泛型的类型String
		a.setK("a");
		System.out.println("字符串"+a.getK());
		a.setK("d");
		System.out.println("字符串"+a.getK());
		
		A<Integer> x=new A<Integer>();//在new A的对象指定泛型的类型String
		x.setK(666);
		System.out.println("整数型"+x.getK());
		
		A a1=new A();//不指定泛型,相当于指定了一个Object类型
		a1.setK(new Object());
		Object obj=a1.getK();
		System.out.println(obj);
		//同样的类,但是在new对象时泛型指定不同的数据类型,这些对象不能互相赋值
	}
}
/**
 * 泛型类,T可以任意取名,意为type
 * @author 
 *
 * @param <T>
 */
class A<T>{
	private T k;
	public void setK(T k) {//获取属性,没有返回值
		this.k=k;
	}
	public T getK() {//返回属性
		return this.k;
	}
}

泛型接口
概念:如果定义的一个接口有一个或多个类型变量,则可以使用泛型。
语法:interface S{ T showInfo(T t);}

public class Text3 {
	public static void main(String[] args) {
		S2<Object> s2 = new S2<Object>();
		S3<String> s3 = new S3<String>();
		System.out.println(s2.show(12));
		System.out.println(s3.show("ss"));
	}
}

interface S1<T> {// 泛型接口
	
	T show(T t);// 接口方法
}

class S2<T> implements S1<T> {// 实现接口类

	@Override
	public T show(T t) {
		return t;
	}
}

/**
 * 如果实现接口时指定接口的泛型的具体数据类型 这个类实现接口所有方法的位置都要泛型替换实际的具体数据类型
 * 
 * @param <T>
 */
class S3<T> implements S1<String> {

	@Override
	public String show(String t) {
		return t;
	}

}

泛型方法
用法:是否拥有泛型方法,与其所在的类是否泛型无关;要定义泛型方法,只需将泛型参数列表置于返回值前。
语法:修饰符 <T,E,…> 返回值类型 方法名(形参列表){方法体}

public class Text2 {
	public static void main(String[] args) {
		R<Object> a = new R<Object>();
		a.setE(12);
		a.text1("qq");
		a.text(2);
		System.out.println(a);
		System.out.println(a.getE(true));
	}
}

class R<T> {
	private T e;

	public static <T> void text(T t) {// 静态泛型方法
		System.out.println(t);
	}

	public <T> void setE(T eT) {// 无返回值的泛型方法
		System.out.println(this.e);
	}

	public <T> T getE(T sT) {// 有返回值的泛型方法
		return sT;
	}

	public <T> void text1(T... ts) {// 形参为可变参数的泛型方法
		for (T s : ts) {
			System.out.println(s);
		}
	}

}

4、注意

  • 单独的T代表一个类型,Class代表这个类型所对应的类,Class代表类型不确定的类;
  • E—Element(在集合里使用,因为集合里存放的是元素)、T—Type(java类)、K—Key(键);
    V—Value(值)、N—Number(数值类型)、?—表示不确定的Java类型;
  • Set:表示集合里面是 Java类;
  • List :表示集合里是 E的实例;
  • List<?>: 表示集合里面对象不确定;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值