Java教程

java容器(1)泛型

本文主要是介绍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);
    }
}

 

 

这篇关于java容器(1)泛型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!