Java 泛型

泛型的概念

  • Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
  • 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型),也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法 

泛型的特性

  • 类型安全性

编译器在编译期就会做类型检查,告知是否插入了错误类型的对象,使得程序更加安全

没用泛型集合演示:

ArrayList list=new ArrayList();
        list.add("泛型");
        list.add(666);
        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            String str=(String)o;
            System.out.println(str);//报错ClassCastException
        }

插入了错误的类型对象,在运行时的转换处理就会出错,ClassCastException

使用泛型集合演示:

ArrayList<String>strList=new ArrayList<>();
        strList.add("java");
        strList.add("java劝退指南");
        for (int i = 0; i < strList.size() ; i++) {
            String s=strList.get(i);
            System.out.println(s);//打印正常
        }
  • 消除强制转换

消除源代码中的许多强制类型转换,使得代码更加可读,减少了出错机会

List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
  • 少去了装箱拆箱操作,提高效率

  • 提高代码的利用性

泛型的使用方式

  1. 泛型类

  2. 泛型接口

  3. 泛型方法

泛型类:把泛型定义在类上

格式:

public class 类名 <泛型类型1,...> {
    
}

ps:泛型类型必须是引用类型,不能是基本数据类型

尖括号中填写类型参数规范

T:任意类型 type
E:集合中元素的类型 element
K:key-value形式 key
V: key-value形式 value

封装一个泛型类:

public class GenericClass<T> {
    private T value;
    public GenericClass(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
    public void setValue(T value) {
        this.value = value;
    }
}

Test类:

//String类型
GenericClass<String> str = new GenericClass<>("学习泛型");
System.out.println(str.getValue());
//Integer类型
GenericClass<Integer> number = new GenericClass<>(123);
System.out.println(number.getValue());

泛型方法:把泛型定义在方法上

格式:

public <泛型类型> 返回类型 方法名(泛型类型 变量名) {
    
}

ps:方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。当调用fun()方法时,根据传入的实际对象,编译器就会判断出类型形参T所代表的实际类型

实例演示:

class Demo{  
  public <T> T fun(T t){   // 可以接收任意类型的数据  
   return t ;     // 直接把参数返回  
  }  
}
public class Demo{  
  public static void main(String args[]){  
    Demo d = new Demo() ; // 实例化Demo对象  
    String str = d.fun("劝退") ; // 传递字符串  
    int i = d.fun(30) ;  // 传递数字,自动装箱  
    System.out.println(str) ; // 输出内容  
    System.out.println(i) ;  // 输出内容  
  }  
}

泛型接口:把泛型定义在接口

格式:

public interface 接口名<泛型类型> {
    
}

实例演示:

public interface Inter<T> {
    public abstract void show(T t) ;
}
 
/**
 * 子类是泛型类
 */
public class InterImpl<E> implements Inter<E> {
    @Override
    public void show(E t) {
        System.out.println(t);
    }
}
 
 
Inter<String> inter = new InterImpl<String>() ;
inter.show("hello") ;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值