java容器(1)泛型

目录

一:泛型简介

 1.1:泛型的基本概念

1.2:泛型的好处

1.3 类型擦除

二:泛型的使用

2.1 定义泛型

2.2:泛型类

代码

2.3:泛型接口

代码

2.4:泛型方法

 代码

静态方法

 代码

2.5:泛型方法与可变参数

代码


一:泛型简介

 1.1:泛型的基本概念

泛型的本质:数据类型的占位符,泛型就是将数据类型参数化,可以像参数一样进行传入

简记:

●把类型当作参数一样进行传递

●<数据类型>只能是引用类型

1.2:泛型的好处

使用泛型的时候所有的类型转换都是由编译器完成的

●代码可读性更好(不用强制类型转换)

●程序更加安全(只要编译器没有警告,那么运行时就不会出现异常)

1.3 类型擦除

●编码时用泛型写的类型参数,编译器会在编译时期去掉,这就叫做“类型擦除”

●泛型主要用于编译阶段,在编译后生成的字节码class文件中不包含泛型中的类型信息

●涉及的类型转换仍是普通的强制类型转换,类型参数会在编译后会被替换成Object,运行时虚拟机并不知道泛型

二:泛型的使用

2.1 定义泛型

泛型字符可以是任何标识符,但是一般用E ,T, K, V, N ? 来标记

●E  Element在容器中使用,代表容器中的元素

●T  Typr表示普通的java类

● K Key表示建,例如:Map中的建Key

● V Valure表示值

● N Number表示数值类型

●? 表示不确定的数值类型

2.2:泛型类

●泛型类就是把泛型定义在类上,用户使用该类是才能把泛型的类型确定下来

●具体的使用方法是在类名后面添加一个或多个类型参数声明如<E>,<E,T,K,V,N>

代码

package com.gnlxy.container;

public class Generics<T> {
    private  T flag;

    public void setFlag(T flag) {
        this.flag = flag;
    }

    public T getFlag() {
        return flag;
    }

}
public class Test {
    public static void main(String[] args) {
        Generics<String>G=new Generics<>();
        G.setFlag("王廷毕打赏");
        String name=G.getFlag();
        System.out.println(name);
        Generics<Integer>I=new Generics<>();
        I.setFlag(1000000);
        Integer number=I.getFlag();
        System.out.println(number);


    }
}

2.3:泛型接口

泛型接口的形式和泛型类一样,但是泛型接口的具体类型要在实现类中进行声明

代码

 

interface Igenerics<T> {
    T Getname(T name);


}
package com.gnlxy.container;

public class IgenericsImpl implements Igenerics<String> {
    @Override
    public String Getname(String name) {
        return name;
    }
}

public class Test2 {
    public static void main(String[] args) {
        IgenericsImpl i=new IgenericsImpl();
       String name= i.Getname("陈舒畅");
        System.out.println(name);
        Igenerics<String>ii=new IgenericsImpl();
        String num=ii.Getname("1000000");
        System.out.println(num);

    }
}

2.4:泛型方法

泛型方法是指将方法的参数类型定义成泛型,以便在调用时用来接收不同的类型的参数

 代码

package com.gnlxy.container;

public class MethodGenerics {
    public<T> void Setname (T name){
        System.out.println(name);

    }
    public<T> T Getname(T name){
        return name;
    }
}
package com.gnlxy.container;

public class Test3 {
    public static void main(String[] args) {
        MethodGenerics M=new MethodGenerics();
        M.Setname("卢鑫宇要考研!!!!");
        MethodGenerics Mm=new MethodGenerics();
        Integer I=Mm.Getname(6);
        System.out.println(I);
    }
}

静态方法

静态方法无法访问类上定义的泛型

 代码

  //静态方法泛型
    public static <T> void SetFlag(T Flag){
        System.out.println(Flag);
    }
    public static <T> T GetFlag(T Flag){
        return Flag;
    }
}
public class Test4 {
    public static void main(String[] args) {
        MethodGenerics.SetFlag("卢鑫宇一定能考上211!!!!!");
       Integer i= MethodGenerics.GetFlag(6);
        System.out.println(i);
    }
}

2.5:泛型方法与可变参数

代码

 
    public <T> void method(T...args){//可变参数 类型...形参名
        for(T t:args){//增强for循环
            System.out.println(t);
        }

public class Test5 {
    public static void main(String[] args) {
        MethodGenerics methodGenerics=new MethodGenerics();
        String[] arr=new String[]{"a","b","c"};
        methodGenerics.method(arr);
        Integer[] arr2=new Integer[]{1,2,3};
        methodGenerics.method(arr2);
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值