泛型的使用

  • 泛型类
/*
当创建Person的对象时,需要指定类型,若不指定则默认Object类型,若制定为String类型,则在类Person中,T的位置全部换成String,即属性String ord;
*/
class Person<T>{
    private String name;
    //定义泛型类T
    T ord;

    public Person() {
    }

    public Person(String name, T ord) {
        this.name = name;
        this.ord = ord;
    }

    public void setOrd(T ord){
        this.ord=ord;
    }
    public T getOrd(){
        return ord;
    }
    
}
  • 泛型类的继承和泛型方法
/*
当创建子类SubPerson的对象时,若制定T为String,则父类中的所有T的位置和父类中T的位置全部换成String
也可以明确指定父类中泛型如class SubPerson<T> extends Person<String>
*/
class SubPerson<T> extends Person<T> {
    T a;

    public SubPerson() {

    }
    public SubPerson(T a) {
        this.a = a;
    }
	//泛型方法,此处用泛型,便可以将任意类型的List放入其中实现多态
    public <E> void getList(List<E> list) {
        ArrayList<E> es = new ArrayList<>();
        for (E e : list) {
            es.add(e);
        }
       
    }
}

  • 整体测试
package JavaFour;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName : CreateNormalTest  //类名
 * @Description : 自定义泛型  //描述
 * @Author : Gao //作者
 * @Date: 2022/3/1  21:17
 */

public class CreateNormalTest {
    public static void main(String[] args) {
        SubPerson<Integer> integerSubPerson = new SubPerson<>(1);
        //调用父类的getOrd()方法,即表明子类在创建对象时也指明了父类的泛型情况
        Integer ord = integerSubPerson.getOrd();
        System.out.println(ord);

        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(9888);
        //调用泛型方法,便可以将Integer类型的传入方法中
        List<Integer> list = integerSubPerson.getList(arrayList);
        for (Integer integer : list) {
            System.out.println(integer);
        }


    }
}

class Person<T> {
    private String name;
    //定义泛型类T
    T ord;

    public Person() {
    }

    public Person(String name, T ord) {
        this.name = name;
        this.ord = ord;
    }

    public void setOrd(T ord) {
        this.ord = ord;
    }

    public T getOrd() {
        return ord;
    }

}


class SubPerson<T> extends Person<String> {
    T a;

    public SubPerson() {

    }
    public SubPerson(T a) {
        this.a = a;
    }

    public <E> List<E> getList(List<E> list) {
        ArrayList<E> es = new ArrayList<>();
        for (E e : list) {
            es.add(e);
        }
        return es;
    }
}

  • 通配符的使用
/*
若A是B的父类,但List<A>和List<B>并无父类关系
若想用多态则需要将其赋予带通配符的List<?>
注意:带赋值给带通配符的则不能添加数据
且取出的数据是Object类型的
*/

@Test
public void test(){

        //
        List<?> list = null;
        List<String> list3 = new ArrayList<>();
        list3.add("AA");
        list3.add("BB");
        list3.add("CC");
        list = list3;
        //添加(写入):对于List<?>就不能向其内部添加数据。
        //除了添加null之外。
//        list.add("DD");
//        list.add('?');
        list.add(null);

        //获取(读取):允许读取数据,读取的数据类型为Object。
        Object o = list.get(0);
       }
  • 带有类型限制的通配符
/*
<? extends Person> 只能是Peron的子类
<? super Person> 只能是Person的父类
*/
  • 统配符合泛型方法

若只是对数据进行读则用通配符,若需要对数据进行修改则建议使用泛型方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值