Java基础-泛型学习指南
2020-04-25 本文已影响0人
JackDaddy
1.什么是泛型
Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制。
该机制允许程序员在编译时检测到非法的类型,泛型的本质是参数类型,也就是说所操作的数据类型被指定为一个参数,泛型不存在于JVM虚拟机
2.为什么使用泛型
1,减少因类型问题引发的运行时的异常,将在运行时才能发现的异常提前到编译期
2,增强代码的复用性,避免类型转换
3.泛型分类
1) 泛型类
//泛型类
class GenerClass<T> {
T name;
public T getName(T name) {
this.name = name;
return name;
}
}
2) 泛型接口
//泛型接口
interface GenerInterface<T> {
T getAddress(T t);
}
3) 泛型方法
//泛型方法
public <T> void gengerMethod(T name) {
}
4.泛型继承/实现的不同
1)继承泛型类(指定泛型类型)
//继承泛型类(指定泛型类型)
class User extends GenerClass<String> {
@Override
public String getName(String name) {
return super.getName(name);
}
}
2)继承泛型类(不指定泛型)
//继承泛型类(不指定泛型)
class UserNoGener<T> extends GenerClass<T> {
@Override
public T getName(T name) {
return super.getName(name);
}
}
3)实现泛型接口(指定泛型类型)
class UserInterface implements GenerInterface<String> {
@Override
public String getAddress(String s) {
return s;
}
}
4)实现泛型接口(不指定泛型类型)
class UserInterfaceNoGener<T> implements GenerInterface<T> {
@Override
public T getAddress(T t) {
return t;
}
}
5.通配符限制
1) 单一限制
//单一限制
class UserWithSingle<T extends GenerClass> {
}
2) 多种限制
//多种限制(类->单继承,接口-多实现)
class UserWithMore<T extends TestGenerClass & testInterface_1 & testInterface_2 & testInterface_3> {
}
小结
- 多种限制的时候只能单继承多实现,指的是类只能单继承,接口可以多实现
- 连接时要用 ' & ' 连接
6.通配符分类
1) 上限通配符-指定泛型可接受的最顶级父类,可读不可写

辅助理解
- 可读:获取的时候知道了最顶级的父类是什么,获取之后可以转换成所需要的类型
- 不可写:写入的时候需要指定具体类型,由于不知道具体类型因此不可写
2)下限通配符-指定泛型可接受的最基础类型,可写不可读

3)非限定通配符-List<?>
List<Object>和List<?>的不同:差在NULL处理,
List<Object>:不支持null入表
List<?>:接受一个null入表
7.泛型的限制
1) 引用传递问题-泛型类中(接口)间无关联

2) 数组中无法使用泛型
3) 在泛型中的必须使用基本类型的包装类
//泛型里只能使用基本类型的包装类
GenerClass<Integer> generInter = new GenerClass<>();
4)泛型擦除
- 无限制时:将泛型替换为Object
- 有限制时:将泛型替换为第一受限类型
- 编译一个扩展参数化类的类,
或一个实现了参数化接口的接口时,编译器有可能因此要创建一个合成方法,名为桥方法。它是类型擦除过程中的一部分
生成桥方法是为了在扩展泛型时保持多态性
Java中List<Object>和原始类型List之间的区别?
- 在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer。
- 可以把任何带参数的泛型类型传递给接受原始类型List的方法,但却不能把List<String>传递给接受List<Object>的方法,因为会产生编译错误。
List<Object>和List<?>之间的区别?
List<Object>和List<?>之间的区别
以上就是对泛型的一些小总结,希望对你有所帮助