泛型类、接口、方法的实际使用

类、方法示例:

/*
 * 泛型类: 直接在类名后加<变量,通常为E或者T>
 * 使用:创建对象时,确定类型。
 * 
 * 泛型方法:直接在方法的返回值前定义泛型加<变量,通常为E或者T>
 * 使用:调用方法时,确定数据类型。
 */
public class MyClass<E> {

	private E e;
	
	public E getE() {
		return e;
	}
	
	public void setE(E e) {
		this.e = e;
	}
	
	//泛型方法
	public <T> void method(T a) {
	
		System.out.println(a.toString());
	}
	
	public static void main(String[] args) {
		MyClass<String> mc = new MyClass<String>();
		
		mc.setE("abc");
		System.out.println(mc.getE());
		
		mc.method("sss");
	}
}

接口示例:

/*
 * 泛型接口:直接在接口名后加泛型<T>
 * 
 * 使用:
 * 		1,定义类时,实现接口,此时将接口中的数据类型确定下来。   这时的类是没有泛型的,其所有类型都已经确定下来了
 * 
 * 		2,定义类时,实现接口,此时将接口中的数据类型仍然没有确定下来。   这时的类是有泛型的,其所有类型都没有确定下来了
 * 		该类在创建对象的时候泛型才能被确定下来
 */
public interface MyInterface<T> {

	public abstract void method(T t); 
}
/*
 * 泛型接口的使用:
 * 		定义类时,实现接口,此时将接口中的数据类型确定下来。   这时的类是没有泛型的,其所有类型都已经确定下来了
 */
//public  class MyInterfaceImpl implements MyInterface<String> {
//
//	@Override
//	public void method(String t) {
//		System.out.println(t.length());
//	}
//
//}
/*
 * 泛型接口的使用:
 * 		定义类时,实现接口,此时将接口中的数据类型仍然没有确定下来。   这时的类是有泛型的,其所有类型都没有确定下来了
 * 		该类在创建对象的时候泛型才能被确定下来
 */
public class MyInterfaceImpl<T> implements MyInterface<T> {

	@Override
	public void method(T t) {
		System.out.println(t);
	}
	
	public static void main(String[] args) {
		MyInterfaceImpl<String> mii = new MyInterfaceImpl<String>();
		mii.method("泛型 so easy!");
	}
	
}

泛型通配符:

这里的?是限定下限,?得是ArrayList泛型E的子类才行。如果extends改为super是限定上限,泛型应是E的父类。
public ArrayList(Collection<? extends E> c)

/*
 * 泛型通配符?
 * 
 * public ArrayList(Collection<? extends E> c)
 * 在上边ArrayList的构造方法中,传入一个Collection集合对象, 会将传入集合的元素,全部拷贝一份放到新建的集合中
 * 
 * 传入参数的泛型类型,必须是我本类的泛型类型的子类
 * 反之,如果是super,则表示 传入参数的泛型类型,必须是我本类的泛型类型的父类
 */
public class Demo04? {

	public static void main(String[] args) {
		
		Collection<String> c = new ArrayList<String>();
		
		c.add("baby");
		c.add("柳岩");
		c.add("林允");
		
		ArrayList<CharSequence> list = new ArrayList<CharSequence>(c);
		
		System.out.println(list);
	}
}