一、什么是泛型?
Java泛型设计原则:只要在 编译时期 没有出现警告,那么运行时期就不会出现ClassCastException异常.
泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。
本质:参数化类型;
把类型当作是参数一样传递<数据类型> 只能是引用类型
通过反射,可以跳过编译时期,看到类型限制仅在于编译阶段。
List<String> list = new ArrayList<>();
list.add("1");
list.add("a");
list.add((new Date()).toString());
try {
Method method = list.getClass().getDeclaredMethod("add",Object.class);
method.invoke(list,new Object());
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
二、泛型通配符
1.无边界通配符
没有限制调用的类型
public static void loop(List<?> list) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+";");
}
}
2.上边界通配符
仅 同级或往下的类类型能被调用
? super Number : Number 、Integer…
public static void loop(List<? extends Number > list) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+";");
}
}
3.下边界通配符
仅 同级或往上的类类型能被调用
? super Number : Number 、Object…
public static void loop(List<? super Number> list) {
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+";");
}
}
三、示例
规则:
必须先声明再使用
泛型的声明通过"<>"实现
约定泛型可以使用单个大写字母表示 常用 K E T V 等
1.泛型类
用于增加代码灵活度??????
public class Generic <T>{
T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
2. 泛型方法
public class Generic<K,V> {
/**
* 普通方法 可以使用类中定义的泛型
* @param k
* @param v
* @return
*/
public K method1(K k,V v){
return (K)null;
}
/**
* 普通方法 使用方法中定义的泛型
* @param t
* @param v
* @param <T>
* @return
*/
public <T>T method(T t,V v){
return (T)null;
}
/**
* 惊天方法中无法使用类中定义的泛型
* @param a
* @param <A>
* @return
*/
public static <A>A method3(A a){
return null;
}
}
3. 泛型接口
public interface Generic<T> {
T add(T a,T b);
}