十九、泛型
2020-02-03 本文已影响0人
你的益达233
泛型
作用:可以解决数据类型的安全性问题
怎么说呢,所有类都可以向上转型为Object,但是真正用的时候就可以类型转错了。但是如果定义泛型就不会有这个问题。
比如Point《String》 p = new Point《String》()
这样只能输入字符串类型
泛型类定义格式
class 类《T》 {
修饰符 《T》 属性;
public 《T》 getter() ;
}
通过构造方法设置内容
class Point<T> {
private T var
public Point(T var){
this.var = var
}
}
定义多个泛型
class Point<T,K>{
private T var;
private K key;
}
泛型的安全警告
在泛型应用中最好在声明类对象的时候指定好其内部的数据类型
如“Info<String>”,如果未指定泛型,会将T设置为Object类型,这样就可以接受所有类型
通配符?
使用?可以接收任意的内容,但是此内容却无法修改
示例代码:
Info<?> i = new Info<String>()
i.setVar("nihao") //会报错
受限泛型,方法和类都可以使用
《T extends Info》 :只能是Info或者其子类
泛型与子类继承的限制
一个类的子类可以通过对象多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接受。
例如:Info<String>不能使用Info<Object>
假设Info<String>是一件商品,Info<Object>是全部商品
泛型其他应用
泛型接口的定义
interface Info<T> {
public T getVar()
}
泛型接口实现的两种方式
第一种: 示例代码
class InfoImpl<T> implements Info<T>{
}
第二种:
class InfoImpl implements Info<String>{
}
泛型方法
跟类是不是泛型类没关系
示例代码:
class Demo{
public <T> T fun(T t){
return t;
}
}
<T>可以看着声明T是什么
通过泛型方法返回泛型类的实例
public static <T extends Number> Info<T> fun(){
Info<T> temp = new Info<T>()
temp.setVar(param)
return temp
}
泛型数组
public static <T> void fun2(T param[]){
for(T t:param){}
}
使用 fun2(Integer i[])
泛型的嵌套使用
Demo<Info<String,Integer>> d = null
Info<String,Integer> i = null
i = new Info<String,Integer>("wold",11)
d = new Demo<Info<String,Integer>>(i)