Java泛型

泛型(Generic)

泛型就是参数化类型,把类型作为可传递参数
常见形式有:泛型类、泛型接口、泛型方法
语法:类名<T>
(可以写多个,中间用逗号隔开)
有以下几种常用泛型类型变量

  • E:元素(Element)
  • K:关键字(Key)
  • N:数字(Number)
  • T:类型(Type)
  • V:值(Value)

好处:

  1. 提高代码的重用性
  2. 防止类型转换异常,提高代码的安全性

泛型类

public class Generic<T> {
    T t;
	
	//使用泛型作为形参
    public void myGeneric(T t){
        System.out.println(t);
    }
	
	//使用泛型作为返回值
    public T getT() {
        return t;
    }

    @Test
    public void Test(){
        Generic<String> generic=new Generic();

        generic.myGeneric("Hello Generic");

        generic.t="我是全局变量";

        System.out.println(generic.getT());
    }
	//输出结果
	//Hello Generic
	//我是全局变量
}

个人感觉实际作用就是为了限制参数类型,保证参数类型都一致
在实例化的时候,Generic<String> generic=new Generic();你给泛型限制的什么类型;
后面的方法或者变量都按照这个类型传递;
除非再实例一个对象传递不同的类型。

(注意)泛型只允许使用引用类型


泛型接口

接口

public interface MyInterface<T> {
    void show(T t);
}

实现类
实现的时候不指定接口的泛型类型(将实现类变成泛型类)

public class MyInterfaceImpl<T> implements MyInterface<T>{
    public void show(T t) {
        System.out.println(t);
    }
    @Test
    public void Test(){
        MyInterface myInterface=new MyInterfaceImpl<String>();
        myInterface.show("通过泛型类来先不指明是什么类型");
    }
}

实现的时候指定泛型类型

public class MyInterfaceImpl implements MyInterface<String>{
    public void show(String t) {
        System.out.println(t);
    }
    @Test
    public void Test(){
        MyInterface myInterface=new MyInterfaceImpl();
        myInterface.show("直接指定泛型类型");
    }
}

泛型方法

从这里可以很明显的体现出代码重用性,实现了类似重载的功能、代码量也减少了。

public class GenericMethod {
    public <T> T show(T t){
        System.out.println(t);

        return t;
    }
    @Test
    public void Test(){
        GenericMethod genericMethod =new GenericMethod();
        genericMethod.show("我输入的是什么类型的值,这个泛型就是什么类型");
        genericMethod.show(100);
        genericMethod.show(3.14);
    }
}

泛型集合

参数化类型、类型安全的集合,强制要求集合元素的类型一致。
特点:

  • 编译时即可检查,而非运行时抛出异常
  • 访问时不必类型转换(拆装箱)
  • 不同类型的泛型之间不能相互赋值,泛型不存在多态

不使用泛型集合,添加不同类型的元素遍历的时候进行类型转换会发生异常

    public void Test(){
        ArrayList arrayList=new ArrayList();
        arrayList.add(10);
        arrayList.add("张三");
        //使用循环遍历想进行类型转换的时候,会发生转换异常
        for (Object o : arrayList) {
            System.out.println((String) o);
        }
    }

使用泛型集合则在你添加不同类型元素的时候会直接报红

  public void Test(){
        ArrayList<String> list =new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        //如果添加的元素类型不一样,会直接报红
        //list.add(100);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值