目录
概述
泛型概述
先大概说一下泛型是什么吧!
泛型泛型,顾名思义就是广泛的类型
再说得通俗一点就是这个类型可以海纳百川
那我们为什么要使用泛型呢?
对于集合中使用泛型,我想大家都已经非常熟悉了
是为了限制集合中数据的类型
需要进行强制类型转换这个问题出现在迭代器那里
如果使用迭代器对集合中的数据进行迭代
那么需要对数据进行类型强制转换,因为迭代器获取到的数据的类型是Object类型
泛型的使用下面举了一个例子(就是在集合中的使用)
再讲一下错误的使用方式,如下
泛型作为方法参数
这里将以一个案例的方式解释如何使用泛型作为方法参数
上代码
Goods类
//Goods类
public abstract class Goods {
public abstract void sell();
}
Book类
//Book类
public class Book extends Goods{
public Book() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("sell book");
}
}
Shoes类
//Shoes类
public class Shoes extends Goods {
public Shoes() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("sell shoes");
}
}
Clothes类
//Clothes类
public class Clothes extends Goods {
public Clothes() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("sell clothes");
}
}
GoodSeller类
//GoodSeller类
import java.util.List;
public class GoodSeller {
public void sellGood(List<? extends Goods> l) {
for(Goods n:l ) {
n.sell();
}
}
public GoodSeller() {
super();
// TODO Auto-generated constructor stub
}
}
GenericMethod类
//GenericMethod类
import java.util.ArrayList;
public class GenericMethod {
public static void main(String[] args) {
Book b1=new Book();
Clothes c1=new Clothes();
Shoes s1=new Shoes();
ArrayList<Book> b=new ArrayList<>();
b.add(b1);
ArrayList<Clothes> c=new ArrayList<>();
c.add(c1);
ArrayList<Shoes> s=new ArrayList<>();
s.add(s1);
GoodSeller gs=new GoodSeller();
gs.sellGood(b);
gs.sellGood(c);
gs.sellGood(s);
}
}
对于泛型作为方法那一部分的代码,解释如下
自定义泛型类
直接上代码吧!
代码中的T就是泛型
这个可以代表任何类型的数据
注意这个类型和基本数据类型不是一个东西
这里如果要放int类型的数据,那么他的数据类型就是Integer
如果将数据类型写成int,那么就会报错,如下图
你也可以写两个自定义类型的泛型,甚至是三个,只要在实例化的时候告诉系统是什么类型即可
自定义泛型方法
其实在开始的时候,我对于自定义泛型方法和泛型作为方法参数有点搞混淆
现在发现自定义泛型方法和自定义泛型类是同一个级别的
泛型作为你方法参数,只能是参数,做不了整个类型方法的主
但是自定义泛型方法却可以做整个泛型方法的主
这里要注意的是,自定义泛型方法要这样写
访问修饰符 + <T> + 返回值类型 +方法名(参数列表)
<T>要写在访问修饰符和返回值类型之间
直接上代码
这里就是简单定义了一个泛型方法
可以往参数列表里面放任意的东西
都会被输出,不需要向自定义泛型类那样,需要指定类型
如果你想要限定泛型的类型,那么可以像下面这样写
这样写的话,如果T不是Number的子类或者是本类就会报错
像下图中的hello就报错了
?extends A类
通过这样一个方式,就可以将类型限制在后面的A类的下面了
只能是后面的A类的子类或者A类本身能够当做方法的参数