包装类,认识泛型

一.包装类

1.基本数据类型和对应的包装类

2.装箱和拆箱

3.自动装箱和自动拆箱

显式拆箱可以拆成自己想要的类型

二.泛型

1.什么是泛型

一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类。不利于编写可以应用于多种类型的代码

泛型就是适用于许多许多类型

2.引出泛型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?

代码示例

class MyArray{
    public Object[] array = new Object[10];

    public Object getPos(int pos){
        return array[pos];
    }
    public void setVal(int pos, Object val){
        array[pos] = val;
    }
}

public class Main {
    public static void main(String[] args) {
        MyArray myArray = new MyArray();
        myArray.setVal(0, 10);
        myArray.setVal(1, "hello");//字符串也可以存放
        String ret = (String) myArray.getPos(1);//编译报错
        System.out.println(ret);
    }
}

问题:以上代码实现后发现

1.任何类型数据都可以存放

2.1号下标本身就是字符串,但是编译报错,必须进行强制类型转换向下转型

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。所以泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型

 3.语法

class MyArray<T>{  //<T>代表当前类是一个泛型类
    public Object[] array = new Object[10];

    public T getPos(int pos){
        return (T)array[pos];
    }
    public void setVal(int pos, T val){  //直接将放的元素指为T
        this.array[pos] = val;
    }
}

public class Main {
    public static void main(String[] args) {
        MyArray<String> myArray = new MyArray<>(); //指定了数组里只能放String类型
        //myArray.setVal(0, 10);//放整型报错了
        myArray.setVal(1, "hello");
        String ret =  myArray.getPos(1);
        System.out.println(ret);

        MyArray<Integer> myArray2 = new MyArray<>();
        myArray2.setVal(1, 10);
        Integer a = myArray2.getPos(1);
        System.out.println(a);
    }
}

这样就可以定义多个存放不同类型的数组了

代码解释:

三.泛型类的使用

1.语法

2.示例

MyArray<Integer> myArray = new MyArray<Integer>(); 

后面这个Integer可以省略

注意:泛型只能接受类,所有基本数据类型必须使用包装类!Integer不能写成int

四.泛型的运行

运行的时候,会把T擦除成Object类

五.泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束

1.语法

2.示例

只接受Number的子类作为E的类型实参

MyArray<Integer> I1; //正常,因为Integer是Number的子类
MyArray<String> I2; //编译错误,因为String不是Number的子类型

没有指定类型边界的E,可以视为E extends Object

复杂示例

实现一个泛型方法可以返回任何类型数组的最大值

class Alg<T extends Comparable<T>>{
        public T Max(T[] array){
                T max = array[0];
                for (int i = 0; i < array.length; i++) {
                        //if (array[i]>max) Object类不能直接比较
                        if (array[i].compareTo(max)>0){  //需要实现Comparable接口
                                max = array[i];    //使用compareTo方法
                        }
                }
                return max;
        }
}

六.泛型方法

1.定义语法

2.示例

class Alg{
        public <T extends Comparable<T>> T Max(T[] array){
                T max = array[0];
                for (int i = 0; i < array.length; i++) {
                        //if (array[i]>max) Object类不能直接比较
                        if (array[i].compareTo(max)>0){  //需要实现Comparable接口
                                max = array[i];    //使用compareTo方法
                        }
                }
                return max;
        }
}
public class Main {
        public static void main(String[] args) {
                Alg alg = new Alg();
                Integer[] array = {1, 22, 55, 21 ,45};
                Integer ret = alg.Max(array);
                System.out.println(ret);
        }
}

也可以不实例化对象,将alg写成静态方法,直接通过类调用

class Alg{
        public static <T extends Comparable<T>> T Max(T[] array){
                T max = array[0];
                for (int i = 0; i < array.length; i++) {
                        //if (array[i]>max) Object类不能直接比较
                        if (array[i].compareTo(max)>0){  //需要实现Comparable接口
                                max = array[i];    //使用compareTo方法
                        }
                }
                return max;
        }
}
public class Main {
        public static void main(String[] args) {
                //Alg alg = new Alg();
                Integer[] array = {1, 22, 55, 21 ,45};
                Integer ret = Alg.Max(array);
                System.out.println(ret);
        }
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值