一、泛型作为方法参数
需求:
1. 定义一个抽象类Goods,包含抽象方法sell()
2. 分别定义类Book,Clothes和Shoes继承Goods,并实现sell()方法,输出一句话,如:sell books
3. 定义一个商品销售类GoodsSeller,模拟销售,包括方法
public void sellGoods(List<Goods> goods),循环调用List对象的sell()方法
4.测试
Goods类
package com.mpp.generic; public abstract class Goods { public abstract void sell(); }
Goods的三个子类:Book,Clothes和Shoes
public class Book extends Goods { @Override public void sell() { System.out.println("sell books"); } } ============================= public class Clothes extends Goods { @Override public void sell() { System.out.println("sell clothes"); } } ============================= public class Shoes extends Goods { @Override public void sell() { System.out.println("sell shoes"); } }
GoodSeller类
package com.mpp.generic; import java.util.List; public class GoodSeller { public void sellGoods(List<? extends Goods> goods){ //加上? extends后 调用方法处的传参是Goods类或者其子类都允许 //调用集合中的sell方法 for(Goods g:goods){ g.sell(); } } }
GoodsTets类
package com.mpp.generic; import java.util.ArrayList; import java.util.List; public class GoodsTest { public static void main(String[] args) { //定义book相关的List List<Book> books = new ArrayList<>(); books.add(new Book()); books.add(new Book()); //定义clothes相关的List List<Clothes> clothes = new ArrayList<>(); clothes.add(new Clothes()); clothes.add(new Clothes()); //定义shoes相关的List List<Shoes> shoes = new ArrayList<>(); shoes.add(new Shoes()); shoes.add(new Shoes()); GoodSeller goodSeller = new GoodSeller(); goodSeller.sellGoods(books);//不匹配出错,修改LsellGoods的传参ist<? extends Goods> goods } }
二、自定义泛型类
自定义一个参数的泛型类
package com.mpp.generic; //泛型类的定义 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> intNum = new NumGeneric<>(); intNum.setNum(10); System.out.println("Integer:"+intNum.getNum()); NumGeneric<Float> floatNum = new NumGeneric<>(); floatNum.setNum(5.0f); System.out.println("Float:"+ floatNum.getNum()); } }
自定义两个参数的泛型类
package com.mpp.generic.homework; public class TwoNumGeneric<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) { TwoNumGeneric<Integer,Float> numObj = new TwoNumGeneric<>(); numObj.getNum(25,2.0f); System.out.println("num1是:"+ numObj.getNum1()); System.out.println("num2是:"+ numObj.getNum2()); } }
三、自定义泛型方法
package com.mpp.generic; public class GenericMethod { //泛型方法 public <T extends Number> void printValue(T t){ System.out.println(t); } public static void main(String[] args) { GenericMethod gm = new GenericMethod(); //泛型方法传入什么就输出什么 // gm.printValue("hello word"); //泛型方法限制类型只能是Number子类,这里出现错误 gm.printValue(124); gm.printValue(2.13); } }