1、概述
泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型
泛型就相当于一个预定义类型
2、好处(掌握)
B、把系统运行期间的异常提前到了编译期间,提高了安全性
C、优化了程序设计,不需要做强制转换了
3、不足(掌握)
泛型传入的只能是引用类型
4、泛型通配符
<?> ?任意类型
<? extends E> E包括E的子类,也叫向下限定
<? super E> E包括E的父类,也叫向上限定
3、泛型的定义
A、在类上定义
说明:
T,S是名字,可以随意起,该处定义的泛型可以在本类的任意地方使用
父类上定义的泛型不能被子类继承
[AppleScript] 纯文本查看 复制代码 /**在类上定义一个泛型*/
class Person1<T> {
}
/**在类上定义两个泛型*/
class Person2<T,S>{
}
/**在类上定义两个泛型,且第二个类型S必须F或者F的子类*/
class Person3<F, S extends F>{
}
B、在方法上定义
因为返回值类型也可能会用到泛型类型,所以泛型的声明要在返回值之前
说明:
T,S是名字,可以随意起,该处定义的泛型可以在该方法的任意地方使用
[AppleScript] 纯文本查看 复制代码 /**在方法上声明一个泛型*/
public <T> void show(T t){
}
/**在方法上声明两个泛型*/
public <T,S> void show(T t, S s){
}
/**在方法上声明两个泛型,切第二个类型S必须是F或者F的子类*/
public <F,S extends F> void show(){
}
C、在接口上定义泛型
和在类上定义一样
3、泛型的使用
可以在继承关系,实现关系,创建对象时使用
4、易错题解析
[AppleScript] 纯文本查看 复制代码 interface English<T> {
void speakEnglish();
}
/**
*
* 问题:可以调用以下String中的substring方法吗
* 第一个<String>是声明一个泛型,名字叫String
* 第二个<String>是使用刚才声明好的泛型
* 所以这两个String与java.lang包下的String没有任何关系
*/
class Person<String> implements English<String>{
@Override
public void speakEnglish() {
}
}
|