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);
}
}