概述
泛型的使用
多态与泛型
两者要一致,Animal 和cat要一致
泛型的作用
-
提高 Java 程序的类型安全
通过前面的学习我们知道, 在集合中可以添加 Object 类型的对象, 如果在不使用泛型的情况下定义了一个 ArrayList 对象, 那 么各种类的对象都可以添加到该集合中。 而在从集合中取值时, 都需要进行强制类型转换, 可以把取出的对象转换成任意类 型, 但是编译时不报错, 但是运行时会发生 ClassCastException 异常。 因此, 使用泛型可以使编译器知道集合的类型限制, 在编译期如果添加不同类型的数据就能发现错误。 -
消除强制类型转换
泛型可以消除源代码中的许多强制类型转换, 这样可以使代码可读性更好, 并减少出错的机会
泛型作为方法参数
Book类
public class Book extends Goods{
@Override
public void sell() {
System.out.println("sell books");
}
}
Clothes类
public class Clothes extends Goods {
@Override
public void sell() {
System.out.println("sell books");
}
}
Goods类
public abstract class Goods {
public abstract void sell();
}
public class GoodsTest {
public static void main(String[] args) {
List<Book> books=new ArrayList<Book>();
books.add(new Book());
books.add(new Book());
//定义服装
ArrayList<Clothes> clothes = new ArrayList<>();
clothes.add(new Clothes());
clothes.add(new Clothes());
GoodsSeller goodsSeller = new GoodsSeller();
goodsSeller.sellGood(books);
goodsSeller.sellGood(clothes);
}
}
该程序的运行结果如下所示
sell books
sell books
sell books
sell books
这里要注意的是,需要
在遍历方法出使用? extends泛型方法,不然在测试类中无法将Book等继承类传入sellGood
自定义泛型类
将平常使用的泛型<>括号里面的数据类型变为T
理解
就是定义类时,暂时不定义数据类型用T替代,需要用到实例对象的时候,传入具体数据类型
例
public class NumGeneric<T> {
private T num;
public T getNum() {
return num;
}
public void setNum(T num) {
this.num = num;
}
public static void main(String[] args) {
NumGeneric<Integer> obj = new NumGeneric<>();
obj.setNum(100);
System.out.println("所传入数据为:"+obj.getNum());
}
}
该程序的运行结果如下所示
所传入数据为:100
使用方法2:传入两个自定义数据类型
例2
public class NumGeneric<T,X> {
private T num1;
private X num2;
public void getNum (T num1,X num2) {
this.num1 = num1;
this.num2 = num2;
}
public T getNum1() {
return num1;
}
public void setNum1(T num1) {
this.num1 = num1;
}
public X getNum2() {
return num2;
}
public void setNum2(X num2) {
this.num2 = num2;
}
public static void main(String[] args) {
NumGeneric<Integer,Float> obj = new NumGeneric<>();
obj.getNum(123,12f);
System.out.println("所输入数据为"+obj.getNum1());
System.out.println("所输入数据为"+obj.getNum2());
}
}
该程序的运行结果如下所示
所输入数据为123
所输入数据为12.0
自定义泛型方法
设置方式
使用方式在修饰符和返回值之间添加
public class GenericMethod {
public<T >void printValue(T t){
System.out.println(t);
}
public static void main(String[] args) {
GenericMethod genericMethod = new GenericMethod();
genericMethod.printValue("123");
genericMethod.printValue(123);
}
}
该程序的运行结果如下所示
123
123
联系之前做题
这边也可以对泛型进行限制
public<T extends Number>void printValue(T t)
其调用时传入参数只能为数值型