泛型的应用

1. 如果没有泛型

  集合中的元素类型就是用泛型规范的,如果没有泛型,集合中的元素类型就不确定,所以需要在处理前进行判断,很麻烦。

package com.basic;

import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(true);
        list.add(123);
        list.add(23);
        list.add("a");

        // 求 list 集合中数字的和
        int sum = 0;
        for (Object o : list) {
            if (o instanceof Integer) { // 进行 Integer 类型判断
                Integer i = (Integer)o;
                sum += i;
            }
        }
        System.out.println(sum);
    }
}

2. 创建带泛型的类

  在创建类时某些数据类型是不确定的,只有在创建对象的时候才确定,这时我们创建带泛型的类。
  类上的泛型,是作用在成员变量和成员方法上的。

package com.basic;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T> {

    private T x;
    private T y;
}
package com.basic;

public class Demo {

    public static void main(String[] args) {
        Point<Integer> p1 = new Point<>();
        p1.setX(2);
        p1.setY(10);
        System.out.println(p1);

        Point<Double> p2 = new Point<>();
        p2.setX(2.19);
        p2.setY(3.981);
        System.out.println(p2);

        Point<String> p3 = new Point<>();
        p3.setX("东经45度");
        p3.setY("北纬45度");
        System.out.println(p3);
    }
}

  可以在类上一次性声明多个泛型

package com.basic;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T1, T2> {

    private T1 x;
    private T2 y;
}
package com.basic;

public class Demo {

    public static void main(String[] args) {
        Point<String, Integer> p = new Point<>();
        p.setX("东经45度");
        p.setY(5);
        System.out.println(p);
    }
}

3. 静态方法中的泛型

  声明在类上的泛型,不能在静态方法中使用,因为类上面声明的泛型是创建对象的时候确定的。但是静态方法不用创建对象直接调用。所以静态方法的泛型要单独声明。

package com.basic;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T1, T2> {

    private T1 x;
    private T2 y;

    public static <M1, M2> void getType(M1 x, M2 y) {
        System.out.println(x);
        System.out.println(y);
    }
}
package com.basic;

public class Demo {

    public static void main(String[] args) {
        Point.getType("东经25度", 35);
    }
}

4. 泛型作用在接口上

  和作用在类上相似,接口在写实现类的时候确定泛型的类型

interface 接口名 <T1, T2> {
	
}

  实现类

class 实现类 implements 接口名 <具体的数据类型> {
	
}

5. 泛型的限定

? :通配符,任意类型,代表可以存储任意类型的数据

List<?> list = new ArrayList<>(); // 代表集合中可以存储任意类型的数据

? extends E:限定了上限,泛型必须是 E 以及 E 的子类。
? super E:限定了下限,泛型必须是 E 以及 E 的父类。

上一篇:Lanelet2 学习笔记


下一篇:李宏毅机器学习组队学习打卡活动day05---网络设计的技巧