java之泛型

1. 泛型的基本用法

/**
 * 泛型的基本用法 泛型是就是参数化类型
 * 
 * @author 27823
 *
 * @param <T>在实例化的时候指定类类型
 */
public class MyList<T> {

  public void add(T item) {

  }

  public T get(int index) {

    return null;
  }
}

public class Test {

  public static void main(String[] args) {
		MyList<String> m1 = new MyList<String>();
		m1.add("哈哈哈");
	}

}

泛型的名字可以为其他的,不一定为T,可以为A,B,C等等都行。

2. 模拟List的添加与获取

/**
 * 泛型的基本用法 泛型是就是参数化类型
 * 
 * @author 27823
 *
 * @param <T>在实例
 */
public class MyList<T> {
  /* 可以存放对象的数组Object */
  Object[] arr = new Object[10];
  int n = 0;

  public void add(T item) {
    arr[n++] = item;
  }

  /**
   * 本方法是用于获取集合中的元素
   * 
   * @param 索引下标
   * @return 返回的是一个对象
   */
  public T get(int index) {
    return (T) arr[index];
  }
}

public class Test {

  public static void main(String[] args) {
    MyList<String> m1 = new MyList<String>();
    m1.add("天涯共此时");
    m1.add("hello");

    String str = m1.get(0);
    System.out.println(str);
  }
}

3. 使用继承的方法限定范围

/**
 * 泛型的基本用法 泛型是就是参数化类型 现在的T通过继承的方式,缩小了泛型的范围,现在的T只能是 String或者其子类
 * 
 * @param <T>
 */
public class MyList<T extends String> {
  /* 可以存放对象的数组Object */
  Object[] arr = new Object[10];
  int n = 0;

  public void add(T item) {
    arr[n++] = item;
  }

  /**
   * 本方法是用于获取集合中的元素
   * 
   * @param 索引下标
   * @return 返回的是一个对象
   */
  public T get(int index) {
    return (T) arr[index];
  }
}

public class Test {

  public static void main(String[] args) {
    /* 如果这块指定的是Data类,会报错 */
    MyList<String> m1 = new MyList<String>();
    m1.add("天涯共此时");
    m1.add("hello");

    String str = m1.get(0);
    System.out.println(str);
  }
}

4. 通配符的神奇功效

/**
 * 泛型的基本用法 泛型是就是参数化类型 现在的T通过继承的方式,缩小了泛型的范围,现在的T只能是 String或者其子类
 * 
 * @param <T>是一个形参
 */
public class MyList<T extends String> {
  /* 可以存放对象的数组Object */
  Object[] arr = new Object[10];
  int n = 0;

  public void add(T item) {
    arr[n++] = item;
  }

  /**
   * 本方法是用于获取集合中的元素
   * 
   * @param 索引下标
   * @return 返回的是一个对象
   */
  public T get(int index) {
    return (T) arr[index];
  }
}

public class Test {

  public static void main(String[] args) {
    MyList<String> m1 = new MyList<String>();
    m1.add("天涯共此时");
    m1.add("hello");
    /* 现在泛型的参数是String,符合限定的范围 */
    foreach(m1);
  }

  /*
   * 功能:处理相关CharSequence的MyList 通配符?是一个实参,所以直接写不需要声明
   * ?号表示我现在也不知道要传入的是什么,有可能是String类,StringBuffer类
   * 等等,但是我可以通过继承的方式限定范围,继承字符序列(就是字符串)
   */
  public static void foreach(MyList<? extends CharSequence> list) {

  }
}

MyList<? extends CharSequence>  list中list是个形参,?是个实参

5. 方法级别的泛型声明

public class Test {

  public static void main(String[] args) {
    System.out.println(hello1("helloWorld"));
  }

  /*
   * 在方法的返回值之前声明一个泛型 <A extends CharSequence> 限定返回值A的范围 A可以是返回值也可以是传入的形参的类型
   */
  public static <A extends CharSequence> String hello1(A text) {
    return text.toString();
  }
}

6. 结果的自动匹配与识别

泛型的自动识别

public class Utils {
	private static Object[] arr = new Object[5];
	
	static {
		arr[0] = new Dog();
		arr[1] = new Cat();
		arr[2] = new Cat();
		arr[3] = new Dog();
		arr[4] = new Cat();
	}
	
	/*
	 * 调用的时候用什么类型接收,返回就会识别为什么类型
	 */
	public <T> T get(int index) {
		return (T)arr[index];
	}
}

public class Test {

	public static void main(String[] args) {
		
		Utils u = new Utils();
		/*
		 *泛型的自动识别,会根据接收的类型从而返回什么类型
		 *这只是语法上正确,比如用Dog接收,在语法上会返回一个
		 *Dog,但是你要是传入的是Cat,这肯定会抛异常
		 */
		Dog a =u.get(1);
		Cat b =u.get(2);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy_yuebin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值