泛型小结

1、泛型使用的原因

    安全:放入会自动检查,如果类型错误编译器会报错

List<String> list = new ArrayList<>();
list.add("abc");
list.add(1);	//报错无法放入整数

    省心:取出的时候自动转为想要的类型

String strGet = list.get(0);	//取出就是String类型
否则需要强制转换,因为list.get(int index)取出的是Object类型
List list = new ArrayList();
list.add("abc");
Object objGet = list.get(0);
if(objGet instanceof String)
{
	String strGet = (String)objGet;	//取出就是String类型
}

2.自定义泛型类,例如在自定义个一个栈,因为栈里面放入的数据类型不确定的,所以这边可以使用泛型,方法:类定义时,类名<字母>。

示例:

class myStack<Item>		//栈中的元素类型未知,使用自定义泛型类
{
	private Item[] a;	//声明一个泛型数组
	private int N;
	public myStack(int cap)
	{
		a = (Item[])new Object[cap];
	}
	public boolean isEmpty()
	{
		return N==0;
	}
	public void push(Item item)
	{
		a[N++] = item;
	}
	public Item pop()
	{
		return a[--N];
	}
}
class Test
{
	public static void main(String[] args)
	{
		myStack<String> stack = new myStack<>(4);//这边栈对象只能添加String类型的数据
	}
}

注意:创建泛型数组是不允许的,即无法使用Item[] a = new Item[cap]的方式,要使用类型转换,Item[] a = (Item[])new Object[cap]

3.泛型接口

public interface Comparator<T>
{
	int MAX_VALUE = 1024;
	void compare(T t);
}

说明:T只能用在抽象方法上,不能用在修饰MAX_VALUE,例如T MAX_VALUE就会报错。

4.非泛型类中定义泛型方法

方法:在返回类型前面<字母>

示例:

public class Method
{
	public static void main(String[] args)
	{
		test("HelloWorld");
	}
	public static <T> void test(T t)//泛型方法的使用
	{
		System.out.println(t);
	}
}

使用泛型方法的好处:test方法中,可以传入任意类型的数据,并将其打印出来,上面例子中,传入后"HelloWorld"就将T变成了字符串类型。

将这个方法局限在某些类型下:public static <T extends List>void test(T b),T类型只能是List类型或者List类型的子类型。

class Method
{
	public static void main(String[] args)
	{
		//test("HelloWorld");	// 报错
		List list = new ArrayList();
		list.add("abc");
		test(list);	//对象list是List的子类
	}
	public static <T extends List> void test(T b)//这时T只能是List的子类
	{
		System.out.println(b);
	}
}

猜你喜欢

转载自blog.csdn.net/chenkaibsw/article/details/79928487