JAVA泛型

2023-12-14 14:36:58

泛型类

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>可以省略
? ? }
}
?

?

文章来源:https://blog.csdn.net/qq_51866806/article/details/134900560
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。