【Java】泛型的理解与使用,包装类

【运动规划算法项目实战】全覆盖分区算法 全覆盖规划在机器人学领域具有重要意义,其应用场景涵盖了自动农场、扫地机器人、扫描监视无人机等多个领域。该问题的核心目标是使机器人能够从指定起点出发,规划一条避开障碍物、同时路径尽可能短的轨迹,从而实现对特定区域的全面覆盖。在实际应用中,全覆盖规划的成功实现对于提高机器人在各类环境中的工作效率至关重要。这一问题的解决涉及到高效的路径规划和规划区域分解技术。其中,梯形单元分解算法是一种常用分区的技术,过将地图上需要规划的区域进行分区,采用梯形分解的方式,可以更好地应对复杂环境。全覆盖算法规划流程。 阅读详情

文章目录

一. 引出泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。

泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现参数化。

我们知道所有类的父类,默认为Object类,那么我们可以实现数组的类型为Object;此时数组中可以存放任意类型的数据,看下面给出的代码:

class MyArray {
 
    public Object[] array = new Object[10];
    public Object getPos(int pos) {
 
        return this.array[pos];
    }
    public void setVal(int pos,Object val) {
 
        this.array[pos] = val;
    }
}
public class TestDemo {
 
    public static void main(String[] args) {
 
        MyArray myArray = new MyArray();
        //存放整形
        myArray.setVal(0,10);
        //字符串也可以存放
        myArray.setVal(1,"hello");
        //也可以存放char,float,自定义类型……
        //编译报错,这里是向下转型,需要进行强制类型转换
        String ret = myArray.getPos(1);
        System.out.println(ret);
    }
}

上面的代码存在两个问题,可以想象如果在实际开发中写出这样的代码,对于代码的维护是非常不友好的;

  1. 任何类型数据都可以存放
  2. 1号下标本身就是字符串,但是确编译报错;必须进行强制类型转换

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种或几种数据类型;而不是同时持有这么多类型。

所以,**泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查;**此时,就需要把类型,作为参数传递;需要什么类型,就传入什么类型。

二. 泛型类

1. 泛型类的语法

【语法】

类名后的 <T> 代表占位符,表示当前类是一个泛型类,T是形参,用来接收传入的数据类型(实参)。

class 泛型类名称<类型形参列表> {
 
// 这里可以使用类型参数
}

class ClassName<T1, T2, ..., Tn> {
 
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
 
// 这里可以使用类型参数
}

class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
 
// 可以只使用部分类型参数
}

 

【规范】类型形参一般使用一个大写字母表示,常用的名称有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等 - 第二、第三、第四个类型

使用泛型就可以解决1中的问题,将1中的代码改写如下:

class MyArray<T> {
 
    //不能实例化泛型类的数组
    public T[] array = (T[])new Object[10];//1
    public T getPos(int pos) {
 
        return this.array[pos];
    }
    public void setVal(int pos,T val) {
 
        this.array[pos] = val;
    }
}

public class TestDemo {
 
    public static void main(String[] args) {
 
        //类型参数化,指定要放入的数据的类型
        MyArray<Integer> myArray = new MyArray<>();//2
        myArray.setVal(0,10);
        myArray.setVal(1,12);
        //不需要自己去实现强转
        int ret = myArray.getPos(1);//3
        System.out.println(ret);
        //编译错误,会进行类型检查
        //myArray.setVal(2,"bit");//4
    }
}

 

【注意事项】:

  1. 注释1处,不能new泛型类型的数组,下面给出的写法是错误的
    T[] ts = new T[5];//是不对的

  1. 注释2处,类型后加入指定当前类型(实参), 要注意的是这里的类型不能是基本数据类型,只能是类类型(具体的一个类) 。

  2. 注释3处,不需要进行强制类型转换,泛型会自动进行强转。

  3. 注释4处,代码编译报错,此时因为在注释2处指定类当前的类型,此时在注释4处,编译器会在存放元素的时候帮助我们进行类型检查,当存放的元素与指定的类型不符时就会编译报错。

2. 泛型类的使用

【语法】

// 定义一个泛型类引用
泛型类<类型实参> 变量名; 
// 实例化一个泛型类对象
new 泛型类<类型实参>(构造方法实参);

【代码示例】

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

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

【类型推导】(Type Inference)

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

MyArray<Integer> list = new MyArray<>(); 
// 可以推导出实例化需要的类型实参为 String

【小结】

  1. 泛型是将数据类型参数化,进行传递
  2. 使用表示当前类是一个泛型类。
  3. 泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

3. 裸类型(Raw Type)

裸类型是一个泛型类但没有带着类型实参,下面给出的就是一个裸类型 

class MyArray<T> {
 
    //……
}
//裸类型
MyArray list = new MyArray();

裸类型并没有传递类型给形参,此时编译器也就不会自动进行类型检查和强制类型转换

所以我们不要自己去使用裸类型,裸类型是为了兼容老版本的 API 保留的机制

三. 泛型是如何编译的

1. 擦除机制

在编译的过程当中,将所有的T替换为Object这种机制,我们称为: 擦除机制 ;

Java的泛型机制是在编译期间实现的,编译器生成的字节码在运行期间并不包含泛型的类型信息。

2. 不能实例化泛型类数组的原因

上面已经提到过,泛型类数组是不能直接进行实例化的,去new一个泛型类的数组编译是通不过的 

T[] ts = new T[5];

因为对于Java的数组来说,在编译时必须知道它持有的所有对象的具体类型,也就是说要实例化T类型的数组,编译器在编译时需要获得T类型;但我们知道泛型是具有擦除机制的,T类型在编译时会被擦除掉,此时也就不存在所谓的泛型了,自然也就无法进行实例化了;所以编译会报错。

我们可以通过反射去实现泛型的实例化:

class MyArray<T> {
 
    public T[] array;
    public MyArray() {
 
    }
    
    /**
     * 通过反射创建,指定类型的数组
     * @param clazz 指定类型
     * @param capacity 指定容量
     */
    public MyArray(Class<T> clazz, int capacity) {
 
        array = (T[]) Array.newInstance(clazz, capacity);
    }
    
    public T getPos(int pos) {
 
        return this.array[pos];
    }
    public void setVal(int pos,T val) {
 
        this.array[pos] = val;
    }
    public T[] getArray() {
 
        return array;
    }

    public static void main(String[] args) {
 
        MyArray<Integer> myArray1 = new MyArray<>(Integer.class,10);
        Integer[] integers = myArray1.getArray();
    }
}

 

五. 泛型方法

【语法】

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表){
 
    //...
}

【定义示例】

public class Util {
 
    //静态的泛型方法 需要在static后用<>声明泛型类型参数
    public static <E> void swap(E[] array, int i, int j) {
 
        E t = array[i];
        array[i] = array[j];
        array[j] = t;
    }
}

 

【使用示例】

不使用类型推导

Integer[] a = {
  ... };
Util.<Integer>swap(a, 0, 9);

String[] b = {
  ... };
Util.<String>swap(b, 0, 9);

使用类型推导

Integer[] a = {
  ... };
swap(a, 0, 9);

String[] b = {
  ... };
swap(b, 0, 9);

六. 泛型的上界

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

【语法】

class 泛型类名称<类型形参 extends 类型边界> {
 
   //...
}

泛型的的上界可以是类,也可以是接口;

上界为类,那么实参必须为上界的子类或者上界本身

//只接受 Number 的子类型作为 E 的类型实参
public class MyArray<E extends Number> {
 
    //...
}

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

上界为接口,那么实参必须是实现了该接口的类

//E必须是实现了Comparable接口的
public class MyArray<E extends Comparable<E>> {
 
    //...
}

【使用实例】

创建两个Person对象,并以其中的age属性进行比较

Person实现了Comparable接口,设置比较方法所在类的泛型上界为Comparable,可以将比较方法设置为实例方法或者是静态方法

class Person implements Comparable<Person>{
 

    public int age;

    public Person(int age) {
 
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
 
        return this.age-o.age;
    }

    @Override
    public String toString() {
 
        return "Person{" +
                "age=" + age +
                '}';
    }
}

class Alg1<T extends Comparable<T>> {
 
    //实例泛型方法,在类的泛型处设置上界
    public T findMax (T[] array) {
 
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
 
            if(max.compareTo(array[i]) < 0 ) {
 
                max = array[i];
            }
        }
        return max;
    }
}
class Alg2 {
 //类名处不设置泛型
    //实例泛型方法,在方法处设置泛型和上界
    public <T extends Comparable<T>> T findMax (T[] array) {
 
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
 
            //if(max < array[i]) {
 
            if(max.compareTo(array[i]) < 0 ) {
 
                max = array[i];
            }
        }
        return max;
    }
}
class Alg3{
 
    //静态泛型方法
    //不依赖对象,必须在方法处设置上界
    public static<T extends Comparable<T>> T findMax (T[] array) {
 
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
 
            if(max.compareTo(array[i]) < 0 ) {
 
                max = array[i];
            }
        }
        return max;
    }
}


public class Test {
 
    public static void main(String[] args) {
 
        Person[] people = {
 new Person(10),new Person(15)};

        //Alg1<Person> alg = new Alg1<>();
        //Person person = alg.findMax(people);

        Alg2 alg = new Alg2();
        Person person = alg.findMax(people);

        //Person person = Alg3.findMax(people);

        System.out.println(person);
    }
}

 

注意观察上面的代码,上面的代码给泛型设置了上界Comparable,此时可以将两个Person对象进行比较,但如果没有设置上界Comparable,泛型在编译时就会被擦除为Object,而 Object是没有实现Comparable接口的 ,无法进行比较功能;所以这里设置了上界,擦除时会擦除为Comparable类型

七. 通配符

1. 介绍

? 用于在泛型的使用,即为通配符

通配符是用来解决泛型无法协变的问题的,协变指的就是如果 Student 是 Person 的子类,那么 List 也应 该是 List 的子类。但是泛型是不支持这样的父子类关系的。

泛型 T 是确定的类型,一旦你传了我就定下来了,而通配符则更为灵活或者说是不确定,更多的是用于扩充参数的范围.

观察下面的代码fun方法,

class Message<T> {
 
    private T message ;
    public T getMessage() {
 
        return message;
    }
    public void setMessage(T message) {
 
        this.message = message;
    }
}

public class TestDemo1 {
 
    public static void main(String[] args) {
 
        Message<Integer> message = new Message() ;
        message.setMessage(99);
        fun(message); // 出现错误,只能接收String
    }
    public static void fun(Message<String> temp){
 
        System.out.println(temp.getMessage());
    }
}

 解决上述问题只需要修改fun方法<>中的参数为通配符即可;要注意这里使用通配符后可以获取元素;但不可以修改元素,因为传入的类型是未知的,无法确定要放入的是什么类型的元素。

// 此时使用通配符"?"描述的是它可以接收任意类型,
//但是由于不确定类型,所以去无法修改数组当中的内容
public static void fun(Message<?> temp){
 
    //temp.setMessage(100); 无法修改!
    System.out.println(temp.getMessage());
}

2. 通配符上界

? extends 类:设置泛型上限

【语法】

<? extends 上界>
<? extends Number>//可以传入的实参类型是Number或者Number的子类

通配符的上界,不能进行写入数据,只能进行读取数据。

代码示例:

class Food {
 
}
class Fruit extends Food {
 
    //...
}
class Apple extends Fruit {
 
    //...
}
class Banana extends Fruit {
 
    //...
}
class Plate<T> {
 
    private T plate ;

    public T getPlate() {
 
        return plate;
    }

    public void setPlate(T plate) {
 
        this.plate = plate;
    }
}
public class TestDemo {
 
    public static void main(String[] args) {
 
        Plate<Fruit> plate1 = new Plate<>();
        plate1.setPlate(new Fruit());
        fun(plate1);

        Plate<Food> plate2 = new Plate<>();
        plate2.setPlate(new Food());
        
        //编译报错,fun上界为Fruit,不能接收Fruit的父类
        //fun(plate2);
    }
    
    public static void fun(Plate<? extends Fruit> temp) {
 
        //编译报错,不能修改
        //temp.setPlate(new Apple());
        
        //可以访问
        Fruit fruit = temp.getPlate();
    }
}

观察上面的代码,无法在fun方法中对temp进行修改元素,因为temp接收的是Fruit和他的子类,此时存储的元素应该是哪个子类无法确定;所以修改会报错!但是可以获取元素。

3. 通配符下界

? super 类:设置泛型下限

【语法】

<? super 下界>
<? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

通配符的下界,不能进行读取数据,只能写入数据。

代码示例:

public class TestDemo {
 
    public static void main(String[] args) {
 
        Plate<Apple> plate1 = new Plate<>();
        plate1.setPlate(new Apple());
        //fun(plate1);//编译报错

        Plate<Food> plate2 = new Plate<>();
        plate2.setPlate(new Food());
        fun(plate2);
    }
    public static void fun(Plate<? super Fruit> temp){
 
        //可以存放Fruit本身或者其子类
        temp.setPlate(new Apple());
        temp.setPlate(new Banana());

        //编译报错,不能存放Fruit的父类
        temp.setPlate(new Food());
        
        //不能取数据,因为无法知道取出的父类的类型是什么?
        //Fruit fruit = temp.getPlate();//编译报错  
    }
}

 

 

观察上面的代码,fun方法中不能获取元素,因为通配符接收的是Fruit的父类,无法获知获取到的是哪个父类型的元素;但是可以存放元素(向上转型是没有问题的)。

八. 包装类

1. 介绍

在Java中,由于基本类型不是继承自Object,也就是说基本数据类型是不具有对象特征的,它们不能像对象一样拥有属性和方法,以及对象化交互。

为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型;通过包装类可以让基本数据类型获取和对象一样的特征,行使对象相关的权力。

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

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

【作用】

  • 作为和基本数据类型对应的类类型存在,方便涉及到对象的操作
  • 提供每种基本数据类型的相关属性如最大值、最小值等以及相关的操作方法

2. 与基本数据类型的转化

装箱:

  • 把基本数据类型转换成包装类,分为自动装箱和手动装箱

拆箱:

  • 把包装类转换成基本数据类型,分为自动拆箱和手动拆箱

【代码示例】

//装箱:把基本数据类型转换成包装类
//1、自动装箱
int i = 10;
Integer ii = i;
Integer ij = (Integer)i;
//2、手动装箱:使用构造方法
//新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
int i = 10;
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);

//拆箱:把包装类转换成基本数据类型
//1、自动拆箱
int j = ii; 
int k = (int)ii;
//2、手动拆箱:使用intValue方法
int j = ii.intValue();

 

3. 常用方法和常量

intValue() :包装类转为int类型

valueOf() :int类型转包装类

parseInt() :字符串转int类型

toString() :包装类转为字符串

与其他进制的转换:

toHexString() :十六进制

toOctalString() :八进制

toBinaryString() :二进制

**MAX_VALUE:**表示int型可取的最大值

**MIN_VALUE:**表示int型可取的最小值

4. 基本类型与包装类型的异同

  1. 在Java中,一切皆对象,但八大基本类型对象。
  2. 声明方式不同,基本类型无需通过new关键字来创建,而包装类型需new关键字。
  3. 存储方式及位置不同,基本类型是直接存储变量的值保存在栈中能高效的存取,包装类型需要通过引用指向实例,具体的实例保存在堆中。
  4. 初始值不同,包装类型的初始值为null,基本类型比如int类型的初始值为0
  5. 使用方式不同,比如泛型中基本数据类型只能使用包装类

5. 一道面试题

下列代码输出什么,为什么?

public static void main(String[] args) {
 
        Integer a = 127;
        Integer b = 127;
        Integer c = 128;
        Integer d = 128;
        System.out.println(a == b);
        System.out.println(c == d);
    }

 

执行结果:

分析:

代码中是将int类型的数据转化为Intgetr类型的数据(装箱),这里虽然是自动装箱,但在底层一定是调用了 valueOf() 实现的装箱;那么这里我们就观察一些Integer类中 alueOf() 方法的源码

 

可以看到在源码中当数剧的值在 [low, high]([-128,127] 源码中可以看到low和high的值为-128和127) 范围内时是直接返回cache数组中的元素的,题目中的 a和b 对应值都为127,在范围内,所以拿到的是数组中的同一个元素,引用自然是相同的;

而c和d对应值为128,不在范围内,源码中可以看到此时是新new了一个Intgetr对象返回;两个不同的对象,引用自当是不等的。

 

 

 

 

 

 

 

 

第55篇:数据隐私保护技术盘点——差分隐私、同态加密与它们的坑(踩坑总结) 数据隐私保护是AI工程化中必须严肃对待的课题。差分隐私和同态加密是两把利器,但也都是“重武器”,使用不当反而会伤及自身。差分隐私像“模糊处理”,通过加噪来保证统计安全性,要小心管理隐私预算和效用权衡。同态加密像“保险箱里打算盘”,保证了计算的精确性,但必须承受巨大的性能和工程复杂度代价。我的建议是:从小规模实验开始,先用DP-SGD在MNIST/CIFAR-10等标准数据集上感受噪声与精度的关系;再用TenSEAL等易用的库尝试一个加密逻辑回归,体会密文膨胀和速度延迟。 阅读详情

相关推荐

从原理到应用:深入解析双编码器在机器人关节力矩感知中的实现

本文深入解析了双编码器方案在机器人关节力矩感知中的实现原理与应用。该方案通过在电机侧和输出侧分别安装编码器,利用两者位置差异间接高精度计算外力,克服了传统电流环精度不足和扭矩传感器成本高昂的缺点。它为实现协作机器人的丝滑拖动示教、灵敏碰撞检测以及足式机器人的动态平衡与柔顺控制提供了关键技术支撑,是目前高性能机器人力控的主流选择。

t8u9v0w1x的博客 662

java 泛型 静态导入

1.要想导入不同的包的类的方法,那么肯定使用import完成. 类中方法全部都属于static,而按照之前的方式如果要使用这个类,操作如下: 如果一个类中的全部方法都是static型的,则可以使用如下的语法进行静态导入. 静态方法 import static 包.类.*; 运行结果 静态导入,是将这个指定类中的全部方法导入进来,最后就好像这些方法全部是在类中定义的方法一样. ...

ysy_1_2的博客 849

Linux USB Gadget框架解析:从设备模拟到驱动开发实战

USB(通用串行总线)是现代计算机系统中应用最广泛的外设连接标准,其主从动态切换的特性使其在嵌入式系统中扮演着双重角色。与I2C、SPI等固定主从架构不同,USB设备需要同时支持主机(Host)和从机(Device)两种模式,这催生了Linux内核中独特的USB Gadget框架。该框架通过分层设计,将硬件控制器驱动(UDC)、功能逻辑(Function)和配置管理(Configfs)解耦,实现了灵活的设备模拟能力。在工程实践中,开发者可以利用Gadget框架快速实现U盘、网络适配器、串口转换器等常见USB

weixin_28007513的博客 561

Java——泛型

为什么用泛型?在定义类时,不知道类是什么类型,而我们又不能定义多个类型,所以用一个模糊的类型——泛型来修饰类。给了代码更高的使用率,不会因为不同类型(ClassCaseException)而导致代码复用率低。代码理解:理解下述代码为何出错import java.util.*;//泛型需要引入uitl包 public class Test1 { public sta...

奔跑的狮子 720

【本体】Protege高效批量导入实例(Individuals)的自动化实践

本文详细介绍了在Protege中高效批量导入实例(Individuals)的自动化实践方法。通过分析Protege本体文件结构,提供Python脚本示例,帮助用户快速处理大规模数据导入,显著提升知识图谱构建效率。特别适合需要处理数千个实例的医疗、制药等领域应用。

weixin_30275415的博客 408

海思MIPI屏调试实战:从参数计算到点亮屏幕的完整指南

本文提供了一份海思平台MIPI屏幕调试的完整实战指南。文章以Hi3516DV300调试800x1280分辨率屏幕为例,详细讲解了从参数计算、配置文件修改到最终点亮屏幕的全流程,并分享了常见问题排查与进阶优化技巧,旨在帮助嵌入式开发者高效解决MIPI屏调试难题。

weixin_29190573的博客 736

包装类和泛型

包装类和泛型的基础讲解和认识

m0_61608447的博客 349

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

java 问号_java泛型--问号?和T或E或K或V的区别

所谓泛型,就是在定义类、接口、方法、参数或成员变量的时候,指定它们操作对象的类型为通用类型。使用 尖括号 <> 操作符 (The diamond operator )表示泛型, 尖括号内可以放置大写字母 (代表一个未知类型) 或问号 ? (代表若干个类型)作为参数。比如,习惯上选择以下字母代表某种类型:T意味某种类型E 意味 链表、数组里的元素,如List list 表示 list ...

weixin_29341747的博客 3549

Deep SHAP 深度学习模型的可解释性分析

Deep SHAP 算法是一种用于解释深度学习模型的技术, 该算法通过将每个特征的重要性与输出值相关联来进行解释。本博客对深度学习的模型可解释性进行了分析。

cnjs1994的博客 5120

【机器学习】推理时计算优化——思维链(Chain-of-Thought)与慢思考范式 第一章:基础理论与认知框架 第二章:计算优化技术与前沿方法

过程监督在数学推理中展现出显著优势,因其能够定位错误发生的具体步骤,而非仅在最终答案处提供稀疏反馈。然而,高质量过程标注的获取成本高昂,这催生了基于自动验证器的近似方法。

VectorShift的博客 72

JAVA泛型和问号占位符

JAVA泛型和问号占位符

a2_45688的博客 834

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 642

【数据结构】包装类和泛型

🎉欢迎大家收看,请多多支持🌹🥰关注小哇,和我一起成长。本文质量分97,主要讲述了数据结构泛型和包装类相关知识点,同时含面试题一道及详细讲解。

欢迎来到 小哇 的博客,会一直加油! 2024

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA SE 包装类和泛型

JAVA SE 包装类和泛型

双吉堡工程专业的一名27届Javaer。 3244

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

包装类and泛型

当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个泛型方法。< T >表明该方法声明了一个类型参数 T,并且这个类型参数 T 只能在该方法中使用。当然,泛型方法中也可以使用泛型类中定义的泛型参数。

qq_57146327的博客 669

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【JAVASE】包装类&简单认识泛型

一般的类和方法,只能使用具体的类型要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。-----来源《Java编程思想》对泛型的介绍。泛型是在JDK1.5。

chendemingxxx的博客 1293

解析Java中的包装类和泛型

本篇文章的主要目的是能够对泛型在语法层面有一个基本的认知,想要真正理解泛型是需要时间和知识的打磨的!

LEE180501的博客 513

【JAVA数据结构】JAVA数据结构必备知识:泛型与包装类

JAVA数据结构预备知识💕

爱打酱油的新一的博客 813

数据结构-1.Java. 初始包装类与泛型

所以,泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。《 Java 编程思想》对泛型的介绍:一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。是不对的,编译的时候,替换为 Object ,不是相当于: Object[] ts = new Object[5]吗?在 Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型.

qq_43023197的博客 693

java 泛型和包装类的使用

一、泛型 1.泛型的引入 我们知道一个顺序表中可以存放int型的对象,那么如果要存入指向 Person 类型对象的引用的顺序表,请问应该如何解决? 首先我们可以想到基类的引用可以指向子类的对象,因为Object是所有类的祖先类,所以我们将顺序表的元素类型定义成 Object 类型,这样我们的 Object 类型的引用可以指向 Person 类型的对象 看这样一段代码: public class M...

丸啊~ 572

数据结构(Java版):包装类和泛型

泛型类:定义一个类时,类的类型可以是泛型类型。泛型方法:方法中的参数类型和返回值类型也可以是泛型类型。通配符(Wildcard):在使用泛型时,有时不希望指定具体的类型,可以使用通配符?来表示。Java中的包装类和泛型是编程中非常重要的概念。包装类提供了基本数据类型的对象表示,允许我们在集合等容器中使用基本数据类型。泛型使得我们可以在代码中使用类型参数,提高了代码的复用性和类型安全性。理解和熟练运用包装类和泛型是开发高效、灵活和安全Java应用的基础。

小蜗牛的珍贵百宝箱 607

Java泛型详解

写在开头:想必大家和博主一样,在以往学习JavaSE的语法中,遇到了一个陌生的词——泛型,博主当时很好奇,什么是泛型呢?即使是学完了JavaSE,这个问题都没有解决,只能在百度查阅了解关于泛型的一些皮毛。却不成想,在数据结构的第一课就接触到了这个问题,为了能帮助大家简单的认识泛型,博主通过学习以及查阅诸多资料,决定写下本篇博客并分享给大家,希望能够帮助到和博主当时有一样困境的小伙伴,同时博主也在持续更新各方面的知识内容,欢迎大家动动手指点个关注,第一时间阅读博主的分享内容!

m0_65038072的博客 1474

JavaDS--泛型、包装类、装,拆箱

泛型 泛型—伪泛型 会进行类型擦除,将E换为Object。 泛型分类: 泛型类 泛型方法 泛型类的定义: 1.尖括号<>是泛型的标志 2.E 是类型变量,变量名一般大写 3.E 在定义时时形参,代表的意思是MyArrayList最终传入的类型,但现在不知道 class MyArrayList<E> { private E[] array; int ca...

sunjiac的博客 170

【Java 集合框架】Java 的泛型和包装类,你要的spring知识大纲已整理好了

2. 预备知识-包装类(Wrapper Class) 2.1 基本数据类型和包装类的对应关系 2.2 包装类介绍 2.3 装箱(boxing)和拆箱(unboxing) 2.4 自动装箱(autoboxing)和自动拆箱(autounboxing) 2.5 包装类面试题 1. 预备知识-泛型(Generic) ====================================================================================..

m0_64867435的博客 175
上一篇: 程序员如果都懂SpringWebFlux框架的话,也不用天天CRUD了
下一篇: 打通JAVA与内核!一个ReentrantLock锁的实现原理
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值