一天一个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的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
随机推荐
- [转载]c# OpenFileDialog
string resultFile = ""; OpenFileDialog openFileDialog1 = new OpenFileDialog(); ...
- Eclipse 中Alt+/快捷键失效的解决办法。
1.Eclipse下进入Windows ->Preperences ->General ->keys2.把word completion的快捷键设置alt+/删掉! 3.把Conte ...
- facebook代码发布
facebook代码发布 2011-08-09 20:34:02 分类: LINUX 所有提交的代码每周二打包一次. 只要多一分努力,终于一天会发生改变. 星期二的代码发布,需要所有的提交过代码的工 ...
- SOAP vs REST
Both methods are used by many of the large players. It's a matter of preference. My preference is RE ...
- poj 1026 Cipher
置换群就可以搞定!!! 注意下格式就好了…… #include<iostream> #include<stdio.h> #include<algorithm> #i ...
- [SQL Server系] -- 基本概念
以下是我总结的 SQL Server 数据库中的一些 基本概念,以便模糊时查询, 欢迎补充 1:主键: 概念: 数据表 经常有 一个列 或 列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称 ...
- BZOJ 3129 SDOI2013 方程
如果没有限制,答案直接用隔板法C(m-1,n-1) 对于>=x的限制,我们直接在对应位置先放上x-1即可,即m=m-(x-1) 对于<=x的限制,由于限制很小我们可以利用容斥原理将它转化为 ...
- lintcode:Palindrome Partitioning 分割回文串
题目: 分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa&q ...
- SaaS系列介绍之十五: SaaS知识重用
1 建立并积累自己的开发体系 遵行业界的规定又有自己的特色是我们所追求的目标.成功的软件公司都有丰富而可复用的代码组件,几行代码在单个系统里可能无足轻重,但一旦可在大量的系统中可重复使用那就是价值不菲 ...
- 2014-9-17二班----11 web project
http://localhost:8080/rwkj1/indexServlet?name=zhagnsan&pwd=1234 跳 转 http://localhost:8080/rwkj ...