Java泛型

Java泛型,第1张

Java泛型

廖雪峰java教程学习笔记


本博客是基于廖雪峰java教程写的学习笔记

文章目录
  • Java泛型
  • 前言
  • 一、泛型是什么?
  • 二、ArrayList
    • 1.ArrayList内部
    • 2.ArrayList
    • 3.向上转型
  • 三、使用泛型
    • 1.使用
    • 2.泛型接口
  • 四、擦拭法
  • 总结


前言

本人计算机小白一枚,写博客的原因一是为了让自己能够更好地理解知识点,加强记忆,二是为了让有需要的同学康康,三是为了能够结交到有相同兴趣的小伙伴,大家一起加油!!!然后本博客只是对自己在教程中不熟悉的地方做一个记录,所以并不全面。


一、泛型是什么?

泛型是一种“代码模板”,可以用一套代码套用各种类型

在抽象地说泛型是什么之前,我们可以先看一下它的典型常用的例子–>ArrayList

二、ArrayList 1.ArrayList内部

ArrayList内部就是一个Object[]数组,配合存储一个当前分配的长度,就可以充当“可变数组”,内部具体如下:

public class ArrayList {
    private Object[] array;
    private int size;
    public void add(Object e) {...}
    public void remove(int index) {...}
    public Object get(int index) {...}
}

如果用ArrayList存储String类型,会有如下缺点:1)需要强制转型;2)不方便,易出错。
例如:

ArrayList list = new ArrayList();
list.add("Hello");
// 获取到Object,必须强制转型为String:
String first = (String) list.get(0);

要解决上述问题,可以单独编写一种StringArrayList,这样存入的必须是String,取出来的也一定是String,但是如果要存储Integer,还需要为Integer单独编写一种IntegerArrayList,这就非常麻烦,于是便有了泛型。

2.ArrayList

代码如下(示例):

public class ArrayList<T> {
    private T[] array;
    private int size;
    public void add(T e) {...}
    public void remove(int index) {...}
    public T get(int index) {...}
}

T可以是任何class。这样我们就可以创建任意类型的ArrayList,因此,泛型就是定义一种模板。

3.向上转型

在Java标准库中的ArrayList实现了List接口,它可以向上转型为List

List<String> list = new ArrayList<string>();

注意:不能将ArrayList向上转型为ArrayListList


三、使用泛型 1.使用

定义泛型类型为

List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
String first = list.get(0);
String second = list.get(1);

编译器如果能自动推断出泛型类型,就可以省略后面的泛型类型。例如:

List<Number> list = new ArrayList<Number>();
2.泛型接口

接口也可以使用泛型哦,例如Arrays.sort(Object[])可以对任意数组进行排序,但待排序的元素必须实现Comparable这个泛型接口:

public interface Comparable<T> {
    /**
     * 返回负数: 当前实例比参数o小
     * 返回0: 当前实例与参数o相等
     * 返回正数: 当前实例比参数o大
     */
    int compareTo(T o);
}

可以直接对String数组进行排序,因为String本身已经实现了Comparable接口,如果换成我们自己定义的Person类就不行,因为Person无法转型为Comparable,我们可以修改代码让Person实现Comparable接口:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Person[] ps = new Person[] {
            new Person("Bob", 61),
            new Person("Alice", 88),
            new Person("Lily", 75),
        };
        Arrays.sort(ps);
        System.out.println(Arrays.toString(ps));
    }
}
class Person implements Comparable<Person> {
    String name;
    int score;
    Person(String name, int score) {
        this.name = name;
        this.score = score;
    }
    public int compareTo(Person other) {
        return this.name.compareTo(other.name);
    }
    public String toString() {
        return this.name + "," + this.score;
    }
}

四、擦拭法

Java的泛型是采用擦拭法实现的;
擦拭法决定了泛型
1)不能是基本类型,例如:int
2)不能获取带泛型类型的Class,例如:Pair.class
3)不能判断带泛型类型的类型,例如:x instanceof Pair
4)不能实例化T类型,例如:new T()

因为引入了泛型,所以,只用Class来表示类型已经不够了,实际上,Java的类型系统结构如下:

总结

提示:这里对文章进行总结:
例如:以上就是Java泛型的简单介绍。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存