泛型

  • JDK5中引入的新特性,提供了编译时类型安全监测机制。
  • 泛型本质就是参数参数化类型,即所操作的数据类型被指定为一个参数

泛型类

class 类名称<泛型标识,泛型标识...>{
   private 泛型标识 变量名称;
   ...
}
//常用的泛型标识: T、E、K、V
  1. 创建泛型类
package test_03;
public class fanixng_test<E> {
	private E key;

	public fanixng_test(E key) {
		super();
		this.key = key;
	}

	public fanixng_test() {
		super();
	}

	public E getKey() {
		return key;
	}

	public void setKey(E key) {
		this.key = key;
	}

	@Override
	public String toString() {
		return "innner [key=" + key + "]";
	}
}
  1. 泛型类的运用
fanixng_test<String> fxtst_string = new test_03.fanixng_test<String>("aaa");
fanixng_test<Integer> fstst_int = new test_03.fanixng_test<Integer>(15);
System.out.println( fxtst_string.getClass() == fxtst_int.getClass() ); //true


//没有指定类型时,默认为 Object
// 同一泛型类创建的不同类型的对象的class对象是一样的

泛型类的派生类

  • 子类也是泛型类,子类和父类的泛型类型要一致

    class ChildGeneric extends Generic

    • 子类也是泛型类,子类如果进行泛型扩展其必须含有父类的泛型标识
  • 子类不是泛型类,父类要明确泛型的数据类型

    class ChildGeneric extends Generic<String\Integer...>

public class fanxing_test2<T> extends fanxing_test<T>{
	
}

class fx3<T ,K > extends fanxing_test2<T>{
	
}

class fx4<T,K,V> extends fx3<T,K>{
	
}
class fx5 extends fx4<Integer , Character, String >{
	
}

泛型接口

  1. 创建泛型接口
public interface fxinterface<T>{
   
   public T getKey();
   
   public void setKey(T key);
   
}
  1. 实现泛型接口
    • 实现类不是泛型
    • 实现类是泛型
//实现类是泛型
package test_03;

public class faxing_test3<T> implements fxinterface<T>{
	
	private T key;
	
	@Override
	public T getKey() {
		// TODO Auto-generated method stub
		return this.key;
	}

	@Override
	public void setKey(T key) {
		// TODO Auto-generated method stub
		this.key = key;
	}

	@Override
	public String toString() {
		return "faxing_test3 [key=" + key + "]";
	}

	public faxing_test3() {
		super();
	}

	public faxing_test3(T key) {
		super();
		this.key = key;
	}
}

泛型方法

  1. 创建泛型方法
修饰符 <T,E,V...> 返回值类型 方法名(参数列表){
    方法体...
}
/*
	public T getKey() {
		return this.key;
	}
	public void setKey(T key) {
		this.key = key;
	}
	
	--- 不是泛型方法
*/

//泛型方法 : 具体的类型,由调用方法时确定
//泛型方法支持静态
public static <E ,V>  void setKey2( E key1 ,V key2) {
		System.out.println(key1 + "\t" + key2);
	}
//泛型方法支持可变参数
public static <E ,V,T>  void setKey2( E key1 ,V key2,T...args) {
		System.out.println(key1 + "\t" + key2);
	}

类型通配符(?)

  • ?: 任意类型实参
public static void f1( faxing_test3<?> fx ) {
		
		System.out.println( fx.getKey());
	
	}

通配符上限

类/接口<? extends 实参类型>
  • 要求该泛型的类型,只能是实参类型(或实参类型的 子类 类型)
	public void f2( faxing_test3<? extends Number> fx) {
		
		System.out.println( fx.getKey() );
	}

通配符下限

类/接口 <? super 实参类型>	
  • 要求该泛型的类型,只能是实参类型(或实参类型的 父类 类型)
public static  void f3( faxing_test3<? super Integer> fx) {
    
		System.out.println(fx.getKey());
	}
posted @ 2020-03-01 15:26  Tolbert  阅读(180)  评论(0)    收藏  举报