廖雪峰java教程学习笔记
本博客是基于廖雪峰java教程写的学习笔记
- Java泛型
- 前言
- 一、泛型是什么?
- 二、ArrayList
- 1.ArrayList内部
- 2.ArrayList
- 3.向上转型
- 三、使用泛型
- 1.使用
- 2.泛型接口
- 四、擦拭法
- 总结
前言
本人计算机小白一枚,写博客的原因一是为了让自己能够更好地理解知识点,加强记忆,二是为了让有需要的同学康康,三是为了能够结交到有相同兴趣的小伙伴,大家一起加油!!!然后本博客只是对自己在教程中不熟悉的地方做一个记录,所以并不全面。
一、泛型是什么?
泛型是一种“代码模板”,可以用一套代码套用各种类型
在抽象地说泛型是什么之前,我们可以先看一下它的典型常用的例子–>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
,这就非常麻烦,于是便有了泛型。
代码如下(示例):
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
,因此,泛型就是定义一种模板。
在Java标准库中的ArrayList
实现了List
接口,它可以向上转型为List
:
List<String> list = new ArrayList<string>();
注意:
不能将ArrayList
向上转型为ArrayList
或List
。
三、使用泛型 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
;
3)不能判断带泛型类型的类型,例如:x instanceof Pair
;
4)不能实例化T
类型,例如:new T()
。
因为引入了泛型,所以,只用Class
来表示类型已经不够了,实际上,Java的类型系统结构如下:
提示:这里对文章进行总结:
例如:以上就是Java泛型的简单介绍。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)