网站首页 > java教程 正文
使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object:
// 编译器警告: List list = new ArrayList(); list.add("Hello"); list.add("World"); String first = (String) list.get(0); String second = (String) list.get(1);
此时,只能把<T>当作Object使用,没有发挥泛型的优势。
当我们定义泛型类型<String>后,List<T>的泛型接口变为强类型List<String>:
// 无编译器警告: List<String> list = new ArrayList<String>(); list.add("Hello"); list.add("World"); // 无强制转型: String first = list.get(0); String second = list.get(1);
当我们定义泛型类型<Number>后,List<T>的泛型接口变为强类型List<Number>:
List<Number> list = new ArrayList<Number>(); list.add(new Integer(123)); list.add(new Double(12.34)); Number first = list.get(0); Number second = list.get(1);
编译器如果能自动推断出泛型类型,就可以省略后面的泛型类型。例如,对于下面的代码:
List<Number> list = new ArrayList<Number>();
编译器看到泛型类型List<Number>就可以自动推断出后面的ArrayList<T>的泛型类型必须是ArrayList<Number>,因此,可以把代码简写为:
// 可以省略后面的Number,编译器可以自动推断泛型类型: List<Number> list = new ArrayList<>();
泛型接口
除了ArrayList<T>使用了泛型,还可以在接口中使用泛型。例如,Arrays.sort(Object[])可以对任意数组进行排序,但待排序的元素(元素所属的类型)必须实现Comparable<T>这个泛型接口:
public interface Comparable<T> { /** * 返回-1: 当前实例比参数o小 * 返回0: 当前实例与参数o相等 * 返回1: 当前实例比参数o大 */ int compareTo(T o); }
可以直接对String数组进行排序:
// sort import java.util.Arrays; public class Main { public static void main(String[] args) { String[] ss = new String[] { "Orange", "Apple", "Pear" }; Arrays.sort(ss); System.out.println(Arrays.toString(ss)); } }
这是因为String本身已经实现了Comparable<String>接口。如果换成我们自定义的Person类型试试:
// sort import java.util.Arrays; public class Main { public static void main(String[] args) { 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; } }
(要让Array.sort实现我们自定义类型的排序,必须在自定义类型内实现Comparable<> 的接口,即重写comparaTo()函数,在函数中比较实际值{比如:person.name} 返回结果值{-1,0,1})
运行上述代码,可以正确实现按name进行排序。
也可以修改比较逻辑,例如,按score从高到低排序。请自行修改测试。
小结
使用泛型时,把泛型参数<T>替换为需要的class类型,例如:ArrayList<String>,ArrayList<Number>等;
可以省略编译器能自动推断出的类型,例如:List<String> list = new ArrayList<>();;
不指定泛型参数类型时,编译器会给出警告,且只能将<T>视为Object类型;
可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型类型。
【关键:
- 使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object
List<Number> list = new ArrayList<Number>(); List<Number> list = new ArrayList<>();
- String本身已经实现了Comparable<String>接口
】
猜你喜欢
- 2024-10-16 Java泛型详解(完整版)必看(java 泛型 t)
- 2024-10-16 Java泛型最全总结(java泛型的实现原理)
- 2024-10-16 Java高级面试:Java的泛型实现机制是怎么样的?
- 2024-10-16 深入理解 Java 泛型(java泛型的实现原理)
- 2024-10-16 关于Java中的泛型使用你不知道的那些事?
- 2024-10-16 Java泛型机制详解;这些你都知道吗?
- 2024-10-16 Java中的泛型是什么?(java里面的泛型)
- 2024-10-16 Java泛型的好处及实现原理详解(java里泛型)
- 2024-10-16 java中的泛型是什么(java中泛型的理解)
- 2024-10-16 一句话概述什么是泛型,教你直白理解Java泛型
你 发表评论:
欢迎- 最近发表
-
- pyinstaller打包python程序高级技巧
- 将python打包成exe的方式(python打包成exe的方法)
- Python打包:如何将 Flask 项目打包成exe程序
- py2exe实现python文件打包为.exe可执行程序(上篇)
- 如何将 Python 项目打包成 exe,另带卸载功能!
- Python打包成 exe,太大了该怎么解决?
- 可视化 Python 打包 exe,这个神器绝了!
- 案例详解pyinstaller将python程序打包为可执行文件exe
- Cocos 3.x 菜鸟一起玩:打包window程序
- 怎么把 Python + Flet 开发的程序,打包为 exe ?这个方法很简单!
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)