泛型

一、泛型作为方法参数

需求:

  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);
    }
}
原文地址:https://www.cnblogs.com/mpp0905/p/10421271.html