Java入门之容器的学习——泛型的学习

泛型的基本概念:

泛型的本质就是“数据类型的参数化”,处理的数据类型不是固定的,而是可以作为参数传入。可以把“泛型”理解为数据类型的一个占位符(类型形式参数),即告诉编译器,在调用泛型时必须传入实际类型。

简单来说:

1.把类型当作参数一样传递

2.<数据类型>只能是引用类型(即不能是基本数据类型(int,short),但可以使用Integer,String)

泛型的优点:

在不使用泛型的情况下,我们用Object类来实现任意参数的参数类型,但在使用时需要我们强制类型转换。但通过使用泛型,我们就可以在编译期间识别出这种错误。

简单来说:

1.代码可读性更好

2.程序更加安全(只要编译时没有警告,运行期间就不会出现ClassCastException异常)

类型擦除

编码时采用泛型血的类型参数,编译器会在编译时去掉。编译的本质仍然是普通的强制类型转换。

泛型类

定义泛型时,一般采用几个标记:E、T、K、V、N、?。

泛型标记对应单词说明
EElement在容器中使用,表示容器中的元素
TType表示普通的JAVA类
KKey表示键,例如:Map中的键Key
VValue表示值
NNumber表示数值类型
表示不确定的JAVA类型

泛型的使用

public class 类名<泛型标识符号>{

}

public class 类名<泛型标识符号,泛型标识符号>{

}


public class Generic<T>{
    private T name;
    public void setName(T name){
        this.name=name;
}


    public static void main(String[] args){
            
        Generic<String> g=new Generic<String>();
        g.setName("1");

        Generic<Integer> g1=new Generic<>(); //后面这个实际类型可以不加
        g1.setName(1);

}

}

泛型接口

泛型接口和泛型类的定义方式是一致的

public interface 接口名<泛型标识符号> {
}


public interface 接口名<泛型标识符号,泛型标识符号> {
}


public interface IGeneric<T>{
        T getName(T name);

}

在实现泛型接口时就给定具体泛型类型

public class IGenericImpl implements IGenerci<String>{

    public String getName(String name){
        return name;

    }
}
public class Test{

    public static void main(String[] args){

        IGeneric<String> igeneric=new IGenericImpl();
        String name=igeneric.getName("1");
        System.out.println(name);

    }
}

在使用时再指定具体数据类型

public class IGenericImpl2<T> implements IGenerci<T>{

    public T getName(T name){
        return name;

    }
}
public class Test{

    public static void main(String[] args){

        IGeneric<String> igeneric1=new IGenericImpl2();
        String name=igeneric1.getName("1");
        System.out.println(name);

    }
}

泛型方法的使用

非静态方法,静态方法

非静态方法可以使用泛型类中所定义的泛型,也可以将泛型定义在方法上

//无返回值方法
public <泛型标识符号> void getName(泛型标识符号 name){
}


//有返回值方法
public <泛型标识符号> 泛型标识符号 getName(泛型标识符号 name){
}
public class methodGeneric{

       public <T> void setName(T name){
            System.out.println(name);
}
       public <T> T getName(T name){
            return name;
}
}

静态方法

不能访问类中的泛型,所以必须将泛型定义在方法上

public class MethodGeneric {
  public static <T> void setFlag(T flag){
    System.out.println(flag);
   }


  public static <T> T getFlag(T flag){
    return flag;
   }
}

可变参数的泛型使用

public <泛型标识符号> void show(泛型标识符号... agrs){
}

public class Method {
  public <T> void method(T...args){
    for(T t:args){              //增强for循环(for each循环)
      System.out.println(t);
     }
   }


}

注意事项:

1.泛型的本质数据类型的参数化

2.基本数据类型不能用泛型,但可以使用对应的包装类,或者用引用类型

3.不能通过类型参数创建对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值