一天一个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的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
随机推荐
- [转载]App.Config详解及读写操作
App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是c ...
- 高性能网络编程1----accept建立连接
转 http://taohui.org.cn/tcpperf1.html 陶辉 taohui.org.cn 回到应用层,往往只需要调用类似于accept的API就可以建立TCP连接.建立连接的流程大 ...
- MySql修改默认端口号,修改my.ini的端口号
MySql默认端口号为3306,如果安装多个或者冲突需要修改端口号,修改my.ini的端口号就可以了,文件一般情况下在安装目录下.下面是具体说明: 方法/步骤 先在服务里停止mysql的服务器,再找到 ...
- Eclipse Error: Unable to set localhost. This prevents creation of a GUID.
Symptoms The following error appears in the atlassian-confluence.log: 2011-03-16 18:20:03,021 ERROR ...
- ifram一些常用的知识点
本文摘自:http://www.cnblogs.com/duankaige/archive/2012/09/20/2695012.html iframe的调用包括以下几个方面:(调用包含html ...
- JAVA WEB中如何让数据库连接对开发人员完全透明?
书上的技术,确实开了眼界. 列相关测试代码如下,慢慢体会开发的模式. PropsUtil package org.smart4j.chapter2.util; import java.io.FileN ...
- 用 EasyBCD 在 Win7/8 中硬盘安装 Ubuntu
写在前面: 1. 我装的是ubuntu 13.10 64位,不一样的地方是,从casper文件夹复制出来的文件不是vmlinuz,而是vmlinuz.efi,相应的,menu.lst里也要将vmlin ...
- cojs 榴莲 题解报告
首先这道题目是求第k大 求第k大我们有逐位确定,主席树,整体二分等等方法 首先我们考虑如何处理每个询问 我们可以二分答案k,之后扫一遍之前的操作 我们只需要知道有多少个权值>=k的操作经过当前点 ...
- MIT算法导论——第二讲.Solving Recurrence
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
- (转)最新版的SSH框整合(Spring 3.1.1 + Struts 2.3.1.2 + Hibernate 4.1)
最近一直有朋友在问,最新版的Spring.Struts.Hibernate整合老是有问题,昨晚大概看了一下.从Hibernate 4 开始,本身已经很好的实现了数据库事务模块,而Spring也把Hib ...