泛型

概念

感觉和C++里的模板类与模板函数差不多。但还是有些规则不一样

分类:

1. 泛型类:

Class Test<T> {
	private T variable;
	Test(T key) {
		this.vatiable = key;
	}
	T Get() {
		return this.variable;
	}
}

【注】:1. 在java中,泛型的类型,不能是简单类。即不能是int,double等类型
2. 即使是泛型类,在声明时,也可以不定义类型。即Test x = new Test(1);Test y = new Test(“2”);

2. 泛型接口:

与泛型类基本一致,只不过分了两种情况

  1. 当泛型接口,未传入泛型实参时:
//此时实现接口的类,也必须变成泛型类,否则会报错
Class Test<T> implements interface<T> {
	@override
	T function(){
		....;
	}
}
  1. 当泛型接口,已出入泛型实参:

这个方法好像有点憨憨,回来再学。

3. 泛型方法:

我的理解是:在方法里定义的泛型,不需要在意方法所在的类,是否是泛型类。因此判断一个方式是否是泛型方法的唯一办法,就是在方法的声明部分,是否有
【注】:在一个方法中存在泛型,不一定就是泛型方法,如:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Date x = Test.<Date>GetInstance("java.util.Date");
		System.out.println(x);
	}
}
class Test<E> {
	static <T> T GetInstance(String name) {// 这才是一个泛型方法
		try {
			Class x = Class.forName(name);
			return (T) x.newInstance();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}
	public E function(E key) {  //这不是一个泛型方法
		System.out.println(key);
		return key;
	}
}

泛型通配符

1.分类:

  1. extends:上界通配符,规定集合里所有的元素,都必须是此类或其子类
  2. super:下界通配符,规定集合里的元素,都必须是此类或其父类

2. 用法:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Main.<TNode>function(new ArrayList<tnode>());//编译正常
		Main.<tnode>function(new ArrayList<TNode>());//编译失败
	}
	static <T> void function(ArrayList<? extends T> list) {
		for(int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}
}
class TNode {
	int date;
}
class tnode extends TNode{
	int x;
}

你可能感兴趣的:(Java)