一天一个Java基础——泛型
这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债
这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲课,但老师讲的挺好,不过由于数据结构欠缺课听的有点烧脑,都是数据结构欠下的债
这学期的新课——英语口语,虽外教老师风骚逗趣浪荡不羁爱自由,但我辈词汇量欠缺,表明淡定说yeah,但心中一万匹草泥马策马奔腾,都是英语欠下的债
1.泛型类
实体类(容器类),经常重用的类,下面是一个没有用泛型的实体类:
- public class User{
- private String username;
- private int number;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public int getNumber() {
- return number;
- }
- public void setNumber(int number) {
- this.number = number;
- }
- public String toString() {
- return "User [username=" + username + ", number=" + number + "]";
- }
- public User(String username, int number) {
- super();
- this.username = username;
- this.number = number;
- }
- public User() {
- super();
- }
- }
属性number可以作为存放学生的证件号码,如果是int类型,11位的学号是够用了,但如果是身份证呢,一是长度不够,二是存在字符X,所以就需要重定义,那么这样这个实体类的重用性就很低了。
但如果用上泛型,就是这样的:
- public class User<K,V> {
- private K usrename;
- private V number;
- public K getUsrename() {
- return usrename;
- }
- public void setUsrename(K usrename) {
- this.usrename = usrename;
- }
- public V getNumber() {
- return number;
- }
- public void setNumber(V number) {
- this.number = number;
- }
- public String toString() {
- return "User [usrename=" + usrename + ", number=" + number + "]";
- }
- public User(K usrename, V number) {
- super();
- this.usrename = usrename;
- this.number = number;
- }
- public User() {
- super();
- }
- }
这样的好处就是:
- public class Test1 {
- public static void main(String[] args) {
- User<String,Integer> u = new User<String,Integer>();
- u.setUsrename("zhengbin");
- u.setNumber(2013734217);
- User<String,String> u1 = new User<String,String>();
- u1.setUsrename("zhengbin");
- u1.setNumber("4*****19951029****");
- System.out.println(u);
- System.out.println(u1);
- }
- }
运行结果:
- User [usrename=zhengbin, number=2013734217]
- User [usrename=zhengbin, number=41****19951029****]
注意:
(1) 按照惯例,像E或T这样的单个大写字母用于表示一个形式泛型类型
(2) 泛型类型必须是引用类型。不能用像int、double或char这样的基本类型来替换泛型类型
2.泛型接口
定义一个生成器的接口:
- package Entity;
- public interface Generator<T> {
- public T next();
- }
实现这个接口:
- package Test;
- import java.util.Random;
- import Entity.Generator;
- public class FruitGenerator implements Generator<String> {
- private String[] fruits = new String[]{"Apple", "Banana", "Pear"};
- public String next() {
- Random rand = new Random();
- return fruits[rand.nextInt(3)];
- }
- }
测试类:
- package Test;
- public class Main {
- public static void main(String[] args) {
- FruitGenerator generator = new FruitGenerator();
- System.out.println(generator.next());
- System.out.println(generator.next());
- System.out.println(generator.next());
- System.out.println(generator.next());
- }
- }
运行结果:
- Banana
- Apple
- Apple
- Pear
3.泛型方法
从jdk 1.5开始,可以定义泛型接口,和泛型类,还可以使用泛型类型来定义泛型方法
- public class Test2 {
- public static void main(String[] args) {
- Integer[] integers = {1,2,3,4,5};
- String[] strings = {"London","Paris","New York","Austin"};
- //为了调用泛型方法,需要将实际类型放在尖括号内作为方法名的前缀(不加也行)
- Test2.<Integer>print(integers);
- Test2.<String>print(strings);
- }
- public static <E> void print(E[] list){
- for(int i = 0;i < list.length;i++){
- System.out.print(list[i]+"-");
- }
- System.out.println();
- }
- }
可以看到方法的参数彻底泛化了,这个过程涉及到编译器的类型推导和自动打包,也就说原来需要我们自己对类型进行的判断和处理,现在编译器帮我们做了
这样在定义方法的时候不必考虑以后到底需要处理哪些类型的参数,大大增加了编程的灵活性
4.通配泛型
通配泛型类型有三种形式:
(1)? ,称为非受限通配,它和? extends Object 是一样的
(2)? extends T 称为受限通配
(3)? super T 称为下限通配,表示T或T的一个未知父类型
一天一个Java基础——泛型的更多相关文章
- Java 基础 -- 泛型、集合、IO、反射
package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...
- java基础-泛型1
浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...
- java基础—泛型
一.体验泛型 JDK1.5之前的集合类中存在的问题——可以往集合中加入任意类型的对象,例如下面代码: 1 package cn.gacl.generic.summary; 2 3 import jav ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- Java基础 - 泛型详解
2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...
- java基础-泛型3
浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...
- java基础 泛型
泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...
- java基础-泛型2
浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...
- Java基础---泛型、集合框架工具类:collections和Arrays
第一讲 泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
随机推荐
- [设计模式] 5 单例模式 singleton
转处 http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多 ...
- FreePlan Windows下默认乱码解决方案
FreePlan 做为一个开源的跨平台的思维导图软件非常好用. 笔者最近在Windows下使用时发现,新建导图文件时默认总是乱码,每次新建元素都需要手动设置一下字体才行. 研究一下,估计是默认模板问题 ...
- hdu 4586 Play the Dice
思路:设期望值为s,前m个是再来一次机会,则有 s=(a[1]+s)/n+(a[2]+s)/n+……+(a[m]+s)/n+a[m+1]/n…… 化简:(n-m)s=sum 当sum=0时,为0: 当 ...
- C#中的文件操作
在.NET Framework 中进行的所有输入和输出工作都要用到流(stream) 有两种类型的流: 输出流:当向某些外部目标写入数据时,就要用到输出流(将数据写入到文件中). 输入流:用于将数据读 ...
- *[hackerrank]Sam and sub-strings
https://www.hackerrank.com/contests/w3/challenges/sam-and-substrings DP.注意到以N[i]结尾的每个字符串的子数字和有规律: 53 ...
- POJ1470 Closest Common Ancestors
LCA问题,用了离线的tarjan算法.输入输出参考了博客http://www.cnblogs.com/rainydays/archive/2011/06/20/2085503.htmltarjan算 ...
- static int和static final int的区别
1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内 ...
- PHP二位数组/多维数组 根据某个键值排序
$arr[$i]['FirstName'] = $d_first_name;$arr[$i]['MiddleName'] = $d_middle_name;$arr[$i]['LastName'] = ...
- 开源调度框架Quartz最佳实践
开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...
- Quartz动态添加、修改和删除定时任务
任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...