Java——泛型和包装类

一、泛型


  • Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
  • 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现? 答案是可以使用 Java 泛型。

Java中的泛型标记符:

  • E(Element):在集合中使用,因为集合中存放的是元素。
  • T(Type):Java类
  • K(Key):键
  • V(Value):值
  • N(Number):数值类型
  • :表示不确定的Java类型

1、泛型方法

public class Test {
        // 泛型方法 printArray
        public static <E> void printArray( E[] inputArray )
        {
            // 输出数组元素
            for ( E element : inputArray ){
                System.out.printf( "%s ", element );
            }
            System.out.println();
        }

        public static void main( String args[] )
        {
            // 创建不同类型数组: Integer, Double 和 Character
            Integer[] intArray = { 1, 2, 3, 4, 5 };
            Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
            Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

            System.out.println( "整型数组元素为:" );
            printArray( intArray  ); // 传递一个整型数组

            System.out.println( "\n双精度型数组元素为:" );
            printArray( doubleArray ); // 传递一个双精度型数组

            System.out.println( "\n字符型数组元素为:" );
            printArray( charArray ); // 传递一个字符型数组
        }
}

在这里插入图片描述

2、泛型类

public class Box<T> {

    private T t;

    public void add(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }

    public static void main(String[] args) {
        Box<Integer> integerBox = new Box<Integer>();
        Box<String> stringBox = new Box<String>();

        integerBox.add(new Integer(10));
        stringBox.add(new String("CSDN"));

        System.out.printf("整型值为 :%d\n\n", integerBox.get());
        System.out.printf("字符串为 :%s\n", stringBox.get());
    }

在这里插入图片描述1

3、类型通配符

类型通配符一般是使用 ? 代替具体的类型参数。例如 List<?> 在逻辑上是 List<String>,List<Integer> 等所有 List<具体类型实参> 的父类。

public class GenericTest {
    public static void main(String[] args) {
        List<String> name = new ArrayList<String>();
        List<Integer> age = new ArrayList<Integer>();
        List<Number> number = new ArrayList<Number>();

        name.add("icon");
        age.add(18);
        number.add(314);

        getData(name);
        getData(age);
        getData(number);

    }

    public static void getData(List<?> data) {
        System.out.println("data :" + data.get(0));
    }
}

在这里插入图片描述
注: 因为 getData() 方法的参数是 List<?> 类型的,所以 name,age,number 都可以作为这个方法的实参,这就是通配符的作用。

  • 泛型的作用是编译期间的一种机制,运行期间没有泛型的概念。
  • 泛型的代码在运行期间,会将类型擦除掉,底层实际上使用的还是Object实现的,但是用户不需要在代码中做强制的类型转换。

在这里插入图片描述

二、包装类


在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
基本数据类型对应的包装类型:

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

注: 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写

1、装箱与拆箱

	int i = 10;
    
    //装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
    Integer integer = Integer.valueOf(i);
    Integer integer1 = new Integer(i);
    
    //拆箱操作,将 Integer 对象中的值,放到一个基本数据类型中
    int j = integer;

为了减轻开发者的负担,Java提供了自动装箱和拆箱的机制。

int i = 10;

// 自动装箱
Integer integer  = i; 
Integer integer2  = (Integer)i; 

// 自动拆箱
int j = integer; 
int k = (int)integer;

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值