JAVA泛型

泛型类

class MyArray<T>{ }
代表当前类是一个泛型类,尖括号“<>”中是泛型所要指定的类型,类型形参一般用一个大写字母表示

类名后的<T>代表占位符,表示当前类是一个泛型类,占位符通常为:

(1)E表示Element
(2)K表示 Key
(3)V表示 Value
(4)N表示Number
(5)T表示Type
(6)s, u,V等等-第二、第三、第四个类型

 

泛型占位符

class MyArray<T>{
    //定义一个T类型的数据
    public T[] array =(T[]) new Object[10];
    
    public T getPos(int pos){
        return array[pos];
    }

    public void setObj(int pos,int val){
        this.array[pos] = val;
    }
}

MyArray<Integer> myArray = new MyArray<Integer>();
实例化一个对象myArray,对象的接收类型只能是Integer类型

myArray.setObj(0,10);
myArray.setObj(1,5);
myArray.setObj(0,10.0);
此时红色部分就会报错,因为接收类型为Integer,编译时会进行检查。
实例化对象的同时指定当前泛型类的指定参数类型是Integer,当设置其他数据类型时会报错
只能存储指定类型数据,不然报错,且指定类型可以有多个

 

 

泛型作用

1.存储数据的时候可以帮我们进行自动的类型检查

2.获取元素的时候,可以帮我们进行类型转换

泛型是编译时期的一种机制,在运行时没有泛型的概念,编译完成之后泛型类型被擦除为Object类

 

 

泛型的上界

public class Alg <E extends Number>{  }
--只接受Number及其子类类型,指定E类型的上界是Number类型

public class Alg2 <E extends Comparable<E>>{ }
--E必须是实现了Comparable接口的

EG:
class Test<E> {
    public E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max < array[i]) {
              for循环中if语句报错,E为引用类型不能直接用大于小于直接比较,基本数据类型可以使用
              E类型为泛型实际都是object类,没有实现Comparable接口,也不能用compareTo来进行比较
                max = array[i];
            }
        }
        return max;
    }
}

class Test1<E extends Comparable<E>> {
    E将来指定的类型必须是实现了Comparable接口,因此在下面可以使用CompareTo比较

    //class Test1<E extends Number>
    上述表示E只能是Number的子类或Number类型本身,代表泛型的上界为Number类

    public E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }
}

 

 

泛型方法

class Alg{
    此处泛型方法中E为,实现了Comparable接口的类型
    public <E extends Comparable<E>> E findMax2(E[] array){
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}

public class UpperBound{

   泛型方法为E类型,但是此处报红,原因是此时E类型是谁?根本不知道,没有意义
   public E findMax(E[] array){
       E max = array[0];
       for (int i = 1; i < array.length; i++) {
           if(max.compareTo(array[i]) < 0){
               max = array[i];
           }
       }
       return max;
   }
   
    public static void main(String[] args) {
        Alg alg= new Alg();
        Integer[] array = {4,5,3,5,6};
        Integer val = alg.<Integer>findMax2(array);
        此处alg.后面的<Integer>可以省略
    }
}
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值