这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是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基础——泛型的更多相关文章

  1. Java 基础 -- 泛型、集合、IO、反射

    package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...

  2. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  3. java基础—泛型

    一.体验泛型 JDK1.5之前的集合类中存在的问题——可以往集合中加入任意类型的对象,例如下面代码: 1 package cn.gacl.generic.summary; 2 3 import jav ...

  4. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  5. Java基础 - 泛型详解

    2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...

  6. java基础-泛型3

    浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...

  7. java基础 泛型

    泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...

  8. java基础-泛型2

    浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...

  9. Java基础---泛型、集合框架工具类:collections和Arrays

    第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...

随机推荐

  1. Unity3d开发wp8问题汇总

    原地址:http://blog.csdn.net/sunshine_1984/article/details/12849117 .wp8应用点击返回键没有响应将Unity3d导出wp8工程后,编译工程 ...

  2. Even Fibonacci numbers

    --Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting ...

  3. Spring整合Ibatis

    Spring整合Ibatis javaibatisspring 所需jar清单           ibatis-2.*.jar    *为任意版本,下同,ibatis工作包           sp ...

  4. 关于inline-block在IE8下无效的解决方法

    <style> .divClass{ width:500px; border:1px solid #ccc; } /*IE8下可以不用加(*zoom:1;*display:inline;需 ...

  5. 欧拉工程第61题:Cyclical figurate numbers

    ---恢复内容开始--- 题目链接 从三角数开始,循环到八角数,再到三角数,求这6个数的和 这个比较复杂,代码在网上找的 Java: package project61; import java.ut ...

  6. ASP.Net WebForm学习笔记:一、aspx与服务器控件探秘

    作者:周旭龙 出处:http://edisonchou.cnblogs.com 开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便 ...

  7. [GCJ]Password Attacker

    https://code.google.com/codejam/contest/4214486/dashboard#s=p0 排列组合.DP递推式,如下代码.dp[m][n]表示长度为n的字符串里有m ...

  8. go的优缺点

    1.1 不允许左花括号另起一行1.2 编译器莫名其妙地给行尾加上分号1.3 极度强调编译速度,不惜放弃本应提供的功能1.4 错误处理机制太原始1.5 垃圾回收器(GC)不完善.有重大缺陷1.6 禁止未 ...

  9. WCF入门(八)---WCF服务绑定

    WCF服务绑定是一个集合,每个元素定义了服务与客户端进行通信方式的几个元素.传输元素和一个消息编码元素各自结合两个最重要的组成部分.这里是WCF服务绑定常用的列表. 基础绑定 基础约束是由basicH ...

  10. Intellij idea使用postgresql 反向生成实例, 'Basic' attribute type should not be 'Object'

    mapped type不能Object? 本人使用 intellij idea 15 , postgresql 9.4,在开发java ee . 在用 Hibernate时, 需要用数据库表反向生成实 ...