当前位置: 首页 > news >正文

【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> {/*** 返回负数: 当前实例比参数o小* 返回0: 当前实例与参数o相等* 返回正数: 当前实例比参数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) {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 {String name;int score;Person(String name, int score) {this.name = name;this.score = score;}public String toString() {return this.name + "," + this.score;}
}

运行程序,我们会得到ClassCastException,即无法将Person转型为Comparable。我们修改代码,让Person实现Comparable<T>接口:

// sort
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;}
}

运行上述代码,可以正确实现按name进行排序。

也可以修改比较逻辑,例如,按score从高到低排序。请自行修改测试。

小结

使用泛型时,把泛型参数替换为需要的class类型,例如:ArrayList<String>ArrayList<Number>等;

可以省略编译器能自动推断出的类型,例如:List<String> list = new ArrayList<>();

不指定泛型参数类型时,编译器会给出警告,且只能将视为Object类型;

可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型类型。

http://www.lryc.cn/news/173572.html

相关文章:

  • 消费者NPS调查,帮您了解客户满意度!
  • Webpack监视文件修改,自动重新打包文件
  • list容器排序案例
  • PHP使用Analysis中英文分词
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?
  • Web服务(Web Service)
  • Java第4章 类的继承
  • Linux网络和安全:配置、远程访问与防御指南
  • 如何搭建Linux环境
  • 【解决方案】edge浏览器批量添加到集锦功能消失的解决方案
  • JS操作字符串方法学习系列(1)-每天学习10个方法
  • iterator和generator
  • ipv6笔记及总结
  • 64位Ubuntu20.04.5 LTS系统安装32位运行库
  • 关于vue.config.js
  • Jupyter NoteBook 中使用 cv2.imshow 显示图片
  • gpt扣款失败,openai扣款失败无法使用-如何解决gpt扣款失败的问题?
  • OJ练习第180题——颠倒二进制位
  • SpringSecurity授权--前端进行访问控制
  • 如何看待Unity新的收费模式?
  • WebRTC系列--sdp协商中的answer编解码协商过程
  • WeCanStudio工具套件介绍
  • 图形化思维:Graphviz和DOT语言的艺术与实践
  • 如何查看电脑详细配置、型号?这4个技巧 yyds!
  • 安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明
  • php如何把数组元素反转-array_reverse使用要点
  • 【CV学习笔记】tensorrtx-yolov5 逐行代码解析
  • 微信管理系统可以解决什么问题?
  • mysql事务测试
  • Spring面试题14:Spring中什么是Spring Beans? 包含哪些?Spring容器提供几种方式配置元数据?Spring中怎样定义类的作用域?