概述
泛型的使用
多态与泛型
两者要一致,Animal 和cat要一致
泛型的作用
-
提高 Java 程序的类型安全
通过前面的学习我们知道, 在集合中可以添加 Object 类型的对象, 如果在不使用泛型的情况下定义了一个 ArrayList 对象, 那 么各种类的对象都可以添加到该集合中。 而在从集合中取值时, 都需要进行强制类型转换, 可以把取出的对象转换成任意类 型, 但是编译时不报错, 但是运行时会发生 ClassCastException 异常。 因此, 使用泛型可以使编译器知道集合的类型限制, 在编译期如果添加不同类型的数据就能发现错误。 -
消除强制类型转换
泛型可以消除源代码中的许多强制类型转换, 这样可以使代码可读性更好, 并减少出错的机会
泛型作为方法参数
Book类
public class Book extends Goods{@Overridepublic void sell() {System.out.println("sell books");}
}
Clothes类
public class Clothes extends Goods {@Overridepublic 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)
其调用时传入参数只能为数值型