1.泛型定义?
1.参化类型,数是JDK1.5的新特性。(定义泛型时使用参数可以简单理解为形参),例如List,Map<K,V>
2.编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如List在运行时String会被擦除,最终系统会认为都是Object.
2.泛型的应用类型
泛型定义时常用方式有三种:
1.泛型类: class 类名<泛型,…>{}
2.泛型接口: interface 接口名<泛型,…>{}
3.泛型方法: 访问修饰符 <泛型> 方法返回值类型 方法名(形参){}
代码实现:
类泛型定义:(用于约束类中方法参数和方法返回值类型)
class Container<T>{//类泛型:类名<泛型>
public void add(T t){}//通过类泛型约束方法参数类型
public T get(){//通过类泛型约束方法返回值类型
return null;
}
}
类泛型应用:关键代码分析
Container<Integer> c1=new Container<>();
c1.add(100);//自定封箱 Integer.valueOf(100)
//c1.add("ABC");
Integer t1=c1.get();
…
说明:自定封箱 Integer.valueOf(100)
泛型应用时相当于实参传给形参,但是实参必须为对象类型。
接口泛型定义:
定义接口时指定泛型,用于约束接口方法参数类型以及方法返回值类型,
interface Task<Param,Result>{//思考map中的泛型Map<K,V>
/**
* 此方法用于执行任务
* @param arg 其类型由泛型参数Param决定
* @return 其类型由泛型参数result决定
*/
Result execute(Param arg1);
}
方法泛型应用:
class ClassPathXmlApplicationContext{
//泛型方法:写一个getBean方法(仿照spring官方)
public <T>T getBean(Class<T> cls){
return null;
}
public <T>T getBean(String id,Class<T> cls){
return null;
}
}
总结:
1)泛型类和泛型接口用于约束类或接口中实例方法参数类型,返回值类型.
2)泛型类或泛型接口中实际泛型类型可以在定义子类或构建其对象时传入.
3)泛型方法用于约束本方法(实例方法或静态方法)的参数类型或返回值类型.
4)泛型类上的泛型不能约束类中静态方法的泛型类型.
3.泛型的通配符"?"
1.泛型应用时有一个特殊符号”?”,可以代表一种任意参数类型(实参类型)。
2.通配符泛型只能应用于变量的定义。例如:Class<?> c1;
/**
* 泛型通配符"?"的应用
* 说明:"?"代表一种不确定的类型,
* 当使用一个泛型类时假如其类型不确定可以使用"?"替代
*/
public class TestGeneric05 {
public static void main(String[] args)throws Exception {
Class<Object> c1=Object.class; //类对象
//System.out.println(c1.toString());
//"?"为泛型应用的一个通配符
//当泛型应用时,无法判定具体类型时,使用"?"替代
//此案例在编译阶段根本无法确定字符串中代理的类型具体为何种类型.
Class<?> c2=Class.forName("java.lang.Object");
//Class<Log> c3=Class.forName("java.lang.Object"); 错误
System.out.println(c1==c2);
}
}
4.泛型的上下界问题
泛型在应用时通常要指定对象的上届和下届,其实现方式如下:
1.指定泛型下界:<? super 类型>
2.指定泛型上界:<? extends 类型>
例如:分析对错
List list1=new ArrayList(); 错误
List list2=new ArrayList(); 错误
List<? extends CharSequence> list1=new ArrayList(); 正确
List<? super Integer> list2=new ArrayList();正确
说明:这种上下界一般会用于方法参数变量定义,方法返回值类型定义。
总结:
泛型问题不再详细赘述,想要了解更详细的,可面向百度。本文部分内容摘自齐*的文档,在此向老师表达敬意。看过的小伙伴可以评论和支持哦!