首页 > 其他分享 >12月25日

12月25日

时间:2025-01-10 18:56:02浏览次数:1  
标签:Box 25 12 java integerBox 类型 new public

泛型的类型参数
泛型的类型参数可以是任何有效的Java类型,但不能是基本数据类型。可以使用类、接口或自定义类型作为类型参数。
类型参数的限制
可以使用extends关键字对类型参数进行限制,表示类型参数必须是某个类的子类或实现某个接口的类。例如:

java
public class Box {
private T t;

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

public T get() {
    return t;
}

}
在这个例子中,Box类的类型参数T必须是Number类的子类,如Integer、Double等:

java
Box integerBox = new Box<>();
integerBox.set(10);
System.out.println(integerBox.get());

Box doubleBox = new Box<>();
doubleBox.set(3.14);
System.out.println(doubleBox.get());

多个类型参数
可以同时使用多个类型参数,每个类型参数用逗号分隔。例如:

java
public class Pair<K, V> {
private K key;
private V value;

public Pair(K key, V value) {
    this.key = key;
    this.value = value;
}

public K getKey() {
    return key;
}

public V getValue() {
    return value;
}

}
可以创建不同类型的Pair对象:

java
Pair<String, Integer> pair1 = new Pair<>("One", 1);
System.out.println(pair1.getKey() + ": " + pair1.getValue());

Pair<String, Double> pair2 = new Pair<>("Pi", 3.14);
System.out.println(pair2.getKey() + ": " + pair2.getValue());

泛型的通配符
通配符(?)用于表示未知类型,可以用于泛型方法的参数或返回值。通配符可以分为无界通配符、有界通配符和通配符的上下界。
无界通配符(?)
无界通配符表示未知类型,可以匹配任何类型。例如:

java
public static void printBox(Box<?> box) {
System.out.println(box.get());
}
可以使用任何类型的Box对象调用printBox方法:

java
Box integerBox = new Box<>();
integerBox.set(10);
printBox(integerBox);

Box stringBox = new Box<>();
stringBox.set("Hello");
printBox(stringBox);

有界通配符(? extends T 和 ? super T)
有界通配符可以对通配符的类型进行限制。? extends T表示类型参数是T的子类,? super T表示类型参数是T的父类。例如:

java
public static void printNumbers(Box<? extends Number> box) {
System.out.println(box.get());
}
可以使用Number的子类类型的Box对象调用printNumbers方法:

java
Box integerBox = new Box<>();
integerBox.set(10);
printNumbers(integerBox);

Box doubleBox = new Box<>();
doubleBox.set(3.14);
printNumbers(doubleBox);

通配符的上下界
通配符的上下界可以同时使用,表示类型参数在某个范围内。例如:

java
public static void process(Box<? super Integer> box) {
box.set(10);
Number n = box.get();
}
可以使用Integer的父类类型的Box对象调用process方法:

java
Box numberBox = new Box<>();
process(numberBox);
System.out.println(numberBox.get());
泛型的类型擦除
Java的泛型在编译时会被擦除,即编译后的字节码中不包含泛型信息。这意味着泛型类型在运行时无法获取具体的类型参数。例如:

java
Box integerBox = new Box<>();
Box stringBox = new Box<>();
System.out.println(integerBox.getClass() == stringBox.getClass()); // 输出 true
在运行时,integerBox和stringBox的类型都是Box,泛型信息被擦除。
类型擦除的影响
类型擦除导致泛型类型在运行时无法获取具体的类型参数,因此无法在运行时进行类型检查和类型转换。例如,以下代码会编译错误:

java
Box integerBox = new Box<>();
Box stringBox = new Box<>();
if (integerBox instanceof Box) { // 编译错误
// ...
}

桥接方法
为了保持类型安全,编译器会为泛型类生成桥接方法(Bridge Methods)。桥接方法是编译器自动生成的,用于在运行时调用具体的方法。例如:

java
public class Box {
public T get() {
return t;
}
}
编译器会生成一个桥接方法:

java
public Object get();
这个桥接方法在运行时被调用,确保类型安全。

标签:Box,25,12,java,integerBox,类型,new,public
From: https://www.cnblogs.com/wenbushi-dream/p/18664518

相关文章

  • 12月20日总结
    今日学习了队列的相关操作:定义:defineMAX_SIZE100//假设队列最大容量为100typedefstructQueue{intdata[MAX_SIZE];intfront;intrear;}Queue;初始化:voidinitQueue(Queue*q){q->front=0;q->rear=0;}入队操作:voidenqueue(Queue*q,intvalue){i......
  • 2024-12-1-#{}与¥{}的区别-response
    {}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应......
  • 12月14日总结
    今日学习了,单链表的基本操作:定义:typedefstructListNode{intdata;structListNode*next;}ListNode;初始化:voidinsertAtHead(ListNode**head,intvalue){ListNode*newNode=(ListNode*)malloc(sizeof(ListNode));newNode->data=value;......
  • 12月15日总结
    今日全身心投入到数据结构中双链表的学习,相较于之前接触的单链表,双链表有着独特的魅力与复杂性。概念上,双链表的每个节点不仅包含指向后继节点的指针(如同单链表),还增设了指向前驱节点的指针。这一设计使得链表在双向遍历上独具优势,无论是从表头向表尾推进,还是反向操作,都能轻松实现......
  • 12月16日总结
    今日学习了双链表的相关操作:一、创建双链表创建双链表的第一步是定义节点结构体,它包含数据域、指向前驱节点的指针prev和指向后继节点的指针next。//双链表节点结构体定义typedefstructDoubleListNode{intdata;structDoubleListNode*prev;structDoubleListNode......
  • 12月17日总结
    今日重点学习数据结构中的栈,它遵循后进先出原则,类似单端进出的储物箱,顶部是唯一的数据出入口,这使其在处理特定顺序问题上优势显著。学习中探究了栈的基本操作,初始化时用结构体表示栈,含存储数据的数组(或链表)与指示栈顶的指针top,初始top设为-1代表空栈。入栈是先让top加1......
  • 12月22日
    今日深入学习了Java中的注解(Annotations)机制,这是Java语言的一个重要特性,用于为程序元素(如类、方法、字段等)提供元数据。注解不直接影响程序的直接运行,但可以被编译器、工具或运行时环境读取和处理,从而实现各种强大的功能,如代码生成、依赖注入、测试等。注解是Java语言中的一种特......
  • 12月18日总结
    今日学习了栈的相关操作:初始化:defineMAX_SIZE100//假设栈的最大容量为100typedefstructStack{intdata[MAX_SIZE];inttop;}Stack;//栈的初始化函数voidinitStack(Stack*s){s->top=-1;}一、增-入栈(Push)入栈操作是向栈顶添加一个新元素,使其成为新的......
  • 12月19日总结
    今日深入学习了数据结构中的队列,它与之前所学的栈有着截然不同的特性。概念上,队列遵循先进先出(FIFO)原则,就如同日常生活中的排队场景,先到的人先接受服务,最先进入队列的元素最先被取出。它有队头(front)和队尾(rear)两个关键指针,分别用于标识队列的起始位置和末尾位置,元素从队尾进入,从......
  • 12月24日
    学习内容概述今日深入学习了Java中的泛型(Generics)机制,这是Java语言的一个重要特性,用于在编译时提供类型安全的集合和方法。泛型可以提高代码的复用性、可读性和安全性,是现代Java编程中不可或缺的一部分。泛型的基本概念泛型是一种在编译时提供类型检查的机制,允许在定义类、接口......