Java中泛型的应用

数组直接定义了存储的类型,防止出现其他类型的元素,集合能不能也像数组一样,直接规定我们集合的存储类型,针对这种情况提出了一种技术:泛型

 

泛型:

将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可以作为参数传递.


看API,接口,类,方法上有<E> ,都是泛型

为什么要使用泛型:

在早期的时候,使用Object类型代表任意类型,向上转型没有问题,使用向下转型的时候(例如String转型Integer),可能会出现问题(需要的类型有问题),这个时候就需要引入泛型操作。
 

泛型的好处:

1)将运行时期异常提前到了编译时期
2)优化了设计,解决了黄色警告线问题
3)避免了强制类型转换

泛型高级(通配符)

<?>  :代表任意类型Object类型,或者任意的Java类
<? extends E>:向下限定,E的子类或者E这个类型
<? super E>:向上限定,E及其他的父类

泛型定义在集合上:


ArrayList<Student> array = new ArrayList<Student>() ;  
等号右边的泛型:泛型推断

泛型定义在接口上


public class InterImpl<T> implements Inter<T>{  //泛型未知
    public void show() {
        System.out.println("hello");
    }
实现时这样定义:Inter<Integer> i = new InterImpl<Integer>();
        i.show() ;

public class InterImpl implements Inter<String> {   //泛型已知
    public void show() {
        System.out.println("hello");
    }
实现时这样定义Inter<String> i = new InterImpl() ;

              i.show() ;

如何理解在接口上定义泛型:
// 泛型接口的定义  
    interface DemoInterface<T1, T2>  
    {  
       T2 doSomeOperation(T1 t);  
       T1 doReverseOperation(T2 t);  
    }  
       
    //实现泛型接口的类  
    class DemoClass implements DemoInterface<String, Integer>  
    {  
       public Integer doSomeOperation(String t)  
       {  
          //其他代码  
       }  
       public String doReverseOperation(Integer t)  
       {  
          //其他代码  
       }  
    } 

泛型定义在类上:

1、把泛型定义在类上,提高程序安全性
2、解决了向下类型转换出现的问题:ClassCastException
public class ObjectTool<T> {

    private T obj ;
    
    public T getObj() {
        return obj ;
    }
    
    public void setObj(T obj) {
        this.obj = obj ;
    }

}
如何理解定义在类上的泛型:
 class DemoClass<T> {  
       //T stands for "Type"  
       private T t;  
       
       public void set(T t) { this.t = t; }  
          
       public T get() { return t; }  
    }

 
    DemoClass<String> instance = new DemoClass<String>();  
    instance.set("lokesh"); //正确的用法  
    instance.set(1);        //编译错误 

泛型定义在方法上

  方法上的泛型和类上的泛型很像,唯一不同的是类型的作用域不同。
  一个方法是不是泛型的,与它所在的类是不是泛型没有什么关系。
  这个泛型方法中定义了一个T类型形参,这个T类型形参可以在该方法内当成普通类型使用。这里无需显示传入实际类型参数,无论调用该方法时传入什么类型的值,系统都可以判断出最直接的类型参数
public <T> void show(T t) {
    System.out.println(t);
}


public static <T> int indexOf(T[] arr, T elm){

       for(int i=0; i<arr.length; i++){ if(arr[i].equals(elm)){ return i;
        }
    } return -1;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值