带你从零学大数据系列之Java篇---第十五章:泛型

课程重点:

  • 泛型的理解
  • 泛型在类上的使用
  • 泛型在接口上的使用
  • 泛型在方法上的使用

15.1. 泛型的简介

泛型, 指的是“泛指的类型”。 将数据类型参数化。

使用泛型, 将某些类型, 在类与类、 类与接口、 方法之间进行传递。 类似于 “传参” 。

15.2. 泛型的好处

  • 用在集合中, 限制存储的元素的类型, 不用再使用元素的时候, 逐个元素进行类型检查。
  • 可以提高代码的可读性。
  • 可以使某些发生在运行时期的逻辑错误问题, 提前到编译时期。

15.3. 泛型的定义方式

泛型, 是定义在一对尖括号里面的。 在尖括号里面定义一个类型。 此时, 定义在这一对尖括号中的类型, 就是泛型。

  • 泛型, 是一个标识符, 遵循大驼峰命名法。
  • 泛型, 一般情况下, 不用太长的类型来描述。 一般情况下, 只需要使用一个字母代替即可。
  • 如果需要定义多种泛型, 直接在尖括号中定义, 泛型与泛型之间以逗号分隔即可。

15.4. 泛型指定类型

在使用到泛型类、接口、方法的时候, 指派每一个泛型具体是什么类型。

注意事项: 泛型类型的指派, 只能是引用数据类型。 泛型不能设置为基本数据类型。 如果真的需要使用到基本数据类型, 使用他们对应的包装类。

15.5. 泛型在类中的使用

15.5.1. 语法部分

定义: 在类名的后面, 紧跟上一对尖括号。

class Animal <T> {}
class Dog <T, M> {}

泛型类的使用: 声明引用、实例化对象、访问静态成员、被继承。

// 1. 声明引用
Animal<String> animal;
// 2. 实例化对象
Animal<Integer> animal = new Animal<>();
// 3. 访问静态成员
Animal<Integer>.display();
// 4. 被继承
class Dog extends Animal<String> {}
class Dog<T> extends Animal<T> {}

15.5.2. 泛型类的特点

  • 在类中定义的泛型, 虽然还不明确是什么类型, 但是在当前类中是可以使用的。
  • 在使用到这个类的时候, 必须要指定泛型的类型。 如果不指定, 默认是 Object。
  • 泛型, 只能在当前的类中使用, 不能在其他的类中使用, 包括子类。

15.5.3. 示例代码

/**
 * @Description   泛型在类中的使用
 */
public class Test {
    public static void main(String[] args) {
        // 实例化一个对象
        // 指定了泛型的类型是 String 类型
        Person<String> xiaoming = new Person<>();
        // 泛型,是在编译前期进行的类型检查。一旦编译完成,泛型就不存在了。
        xiaoming.part = "xiaoming";

        Person<Integer> xiaohong = new Person<>();
        xiaohong.part = 2;

        // 实例化一个子类对象
        Student student = new Student();
        student.part = "abc";

        // 实例化一个泛型子类对象
        Teacher<Integer> xiaowang = new Teacher<>();
        xiaowang.part = 132;

        // 如果多个泛型,使用这个类的时候,逐个进行类型指派即可
        Animal<String, Integer> animal = new Animal<>();

        // 如果对于一个泛型类,在使用的时候,没有指派类型,默认是 Object 类型
        Person xiaobai = new Person();
    }
}

class Animal<T, M> { }

class Person<T> {
    String name;
    int age;
    T part;     // 虽然现在还不明确T是什么类型,但是我们可以使用这个类型。
}

class Student extends Person<String> {}

class Teacher<E> extends Person<E> { }14.6. 泛型在接口中的使用

15.6.1. 语法部分

泛型接口的定义: 在接口名字的后面, 添加上一对尖括号。 在尖括号里面定义泛型。

interface MyInterface<T> {}
interface MyInterface<T, M> {}

泛型接口的使用: 实现类实现接口、 使用接口访问接口中的静态成员、 被继承。

// 1. 实现类实现接口
class MyInterface1Impl implements MyInterface1<Person> {}
// 2. 使用接口访问接口中的静态成员
MyInterface<String>.test();
// 3. 被继承
interface SubMyInterface extends MyInterface1<String> {}

15.6.2. 泛型接口的特点

  • 在接口中定义的泛型, 虽然还不明确是什么类型, 但是在当前接口中是可以使用的。
  • 在使用到这个接口的时候, 必须要指定泛型的类型。 如果不指定, 默认是 Object。
  • 泛型, 只能在当前的接口中使用, 不能在其他的接口中使用, 包括子接口。

15.6.3. 示例代码

/**
 * @Description 泛型接口的使用
 */
public class Test {
    public static void main(String[] args) {
        // 使用匿名内部类的形式实现接口
        MyInterface1<Person> impl = new MyInterface1<Person>() {
            @Override
            public int compareTo(Person o1, Person o2) {
                return 0;
            }
        };
        // 使用lambda表达式实现接口
        // 此时,会根据左侧的接口引用中的泛型,推导出接口实际指派的类型是谁
        MyInterface1<Person> impl1 = (o1, o2) -> o1.age - o2.age;
        MyInterface1<String> impl2 = (o1, o2) -> o1.length() - o2.length();
    }
}

// 定义一个泛型接口
interface MyInterface1<T> {
    int compareTo(T o1, T o2);
}

// 子接口
interface SubMyInterface extends MyInterface1<String> {}

// 实现类
class MyInterface1Impl implements MyInterface1<Person> {
    @Override
    public int compareTo(Person o1, Person o2) {
        return 0;
    }
}

class Person {
    int age;
}

15.7. 泛型在方法中的使用

15.7.1. 语法部分

定义: 泛型方法中, 在返回值前面定义泛型。

public static <T> void test() {
    
}

15.7.2. 泛型方法的特点

  • 在方法中定义的泛型, 虽然还不明确是什么类型, 但是在当前方法中是可以使用的。
  • 泛型方法, 在使用的时候, 不能跟类、接口似的, 手动的设置类型。 泛型方法中, 泛型的设置, 在参数中体现。
    • 泛型方法, 一定需要是有参的。 参数列表中, 必须有泛型类型。
    • 泛型方法中的泛型的设置, 是通过在调用方法的时候, 实参的类型推导出来的。
  • 泛型, 只能在当前的方法中使用, 不能在其他的方法中使用。

15.7.3. 示例代码

/**
 * @Description   泛型在方法中的使用
 */
public class MethodTest {
    public static void main(String[] args) {
        test("hello");
        test(1);
        test(3.14);
    }
    // 定义一个泛型方法
    public static <T> void test(T t) {
        System.out.println(t.getClass());
    }
展开阅读全文
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值