1、定义:泛型的本质是参数化类型,就是将类型由原来的具体的类型参数化,这种参数类型可以用在类、接口、方法中,分别称为泛型类、泛型接口、泛型方法;

2、泛型类:泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分,最典型的就是各种容器类,List、Set、Map;

 public class Box<T>{
private T t; public T getT() {
return t;
} public void setT(T t) {
this.t = t;
}
}

a、泛型的类型参数只能是引用型类型<Integer>、<Double>(包括自定义类)等,不能是原始类型<int>、<double>等;

b、实例化泛型类时,必须指定 T 的具体类型;

c、参数化类型 T 可以写成任意字符,常用的 T 、E、K、V等表示泛型;

3、泛型接口:泛型接口与泛型类的定义及使用基本相同;

 public interface Box<T> {
public T next();
}

a、实现泛型接口的类未传入泛型实参时,在声明此类的时候,需将泛型的声明也加到类中;

 class B<T> implements Box<T>{
@Override
public T next() {
return null;
}
}

b、实现泛型接口的类传入泛型实参时,需将所有使用泛型的地方都要换成实参类型;

 public class B implements Box<String> {

     private String[] fruits = new String[]{"Apple", "Banana", "Pear"};

     @Override
public String next() {
return null;
}
}

4、泛型方法:调用方法的时候,指明泛型的具体类型;

 // 泛型类
class Box<T> {
/**
* 在泛型类中声明了一个泛型方法,使用泛型E,这种泛型E可以为任意类型,可以类型与T相同,也可以不同。
* 由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中并未声明泛型,编译器也能够正确识别泛型方法中识别的泛型。
*/
public <E> void B_1(E t) {
System.out.println(t.toString());
} /**
* 在泛型类中声明了一个泛型方法,使用泛型T,注意这个T是一种全新的类型,可以与泛型类中声明的T不是同一种类型。
*
*/
public <T> void B_2(T t) {
System.out.println(t.toString());
} // 不是泛型方法
public void B_3(T t){
System.out.println(t.toString());
}
}

a、所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在上面例子中的<E>、<T>);

b、只有声明了<T>、<E>的方法才是泛型方法(B_1、B_2),泛型类中使用泛型的成员方法不是泛型方法(B_3);

c、<T>、<E>表明该方法将使用泛型类型T、E,此时才可以在方法中使用泛型类型T、E;

d、泛型方法体的声明和其他方法一样,只能是引用型类型,不能是原始类型(int、double,char等);

5、泛型上下边界:在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类;为泛型添加上边界,即传入的类型实参必须是指定类型的子类型;

 // 泛型类
class Box<T extends Number> {
private T t;
public Box(T t){
this.t = t;
}
public T getT(){
return t;
}
}
Box<Integer> b = new Box<Integer>(1000);// Integer类型是Number类型的子类————正确
Box<String> s = new Box<String>("1000");// String类型不是Number类型的子类————错误

6、类型通配符:一般是使用 ?代替具体的类型参数,?是类型实参,和Integer、Number一样都是一种实际的类型,?可以看成所有的类型的父类(List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类);

 public static void main(String[] args) {
Box b = new Box();
List<String> sLst = new ArrayList<String>();
sLst.add("100");
List<Integer> iLst = new ArrayList<Integer>();
iLst.add(100);
List<Number> nLst = new ArrayList<Number>();
nLst.add(1000);
b.BPrint(sLst);
b.BPrint(iLst);
b.BPrint(nLst);
} /**
* <? extends T>表示该通配符所代表的类型是T类型的子类
* <? super T>表示该通配符所代表的类型是T类型的父类
*/
class Box {
public void BPrint(List<?> lst) {
System.out.println(lst);
}
}

Java知识点梳理——泛型的更多相关文章

  1. java知识点梳理

    网络搜索结果,出处不详,仅供参考 对于刚刚接触Java的人,java基础知识技术点繁多,那么gkstk小编为大家汇总最全java知识点如下,仅供大家参考学习! 1. JVM相关(包括了各个版本的特性) ...

  2. Java核心技术梳理-泛型

    一.引言 在学习集合的时候我们会发现一个问题,将一个对象丢到集合中后,集合并不记住对象的类型,统统都当做Object处理,这样我们取出来再使用时就得强制转换类型,导致代码臃肿,而且加入集合时都是以Ob ...

  3. Java知识点梳理——集合

    1.定义:Java集合类存放于java.util包,是存放对象的容器,长度可变,只能存放对象,可以存放不同的数据类型: 2.常用集合接口: a.Collection接口:最基本的集合接口,存储不唯一, ...

  4. Java知识点梳理——装箱和拆箱

    1.前言:Java是典型的面向对象编程语言,但其中有8种基本数据类型不支持面向对象编程,基本数据类型不具备对象的特性,没有属性和方法:Java为此8种基本数据类型设计了对应的类(包装类),使之相互转换 ...

  5. Java知识点梳理——继承

    1.定义:继承允许创建分等级层次的类,就是子类继承父类的特征行为,使得子类对象具有父类实例的方法,   使得子类具有父类相同的行为. 2.继承的特性: a.子类拥有父类非priavte的属性.方法: ...

  6. Java知识点梳理——多态

    1.定义:多态是同一个行为具有多个不同表现形式或形态的能力,即一个接口不同的实例执行不同的操作: 2.优点:消除类型之间的耦合关系.可替换性.可扩展性.接口性.灵活性.简化性: 3.多态存在的3个必要 ...

  7. Java知识点梳理——抽象类和接口

    抽象类 1.定义:没有包含足够的信息来描绘一个具体对象的类,不能被实例化,必须被继承: 2.abstract关键字:abstract class定义抽象类,普通类的其它功能依然存在,如变量.方法等: ...

  8. Java知识点梳理——读写分离

    1.读写分离:可以通过Spring提供的AbstractRoutingDataSource类,重写determineCurrentLookupKey方法,实现动态切换数据源的功能:读写分离可以有效减轻 ...

  9. Java知识点梳理——常用方法总结

    1.查找字符串最后一次出现的位置 String str = "my name is zzw"; int lastIndex = str.lastIndexOf("zzw& ...

随机推荐

  1. python-rtslib 模块

    Python library for configuring the Linux kernel-based multiprotocol SCSI target (LIO) A Python objec ...

  2. hexo添加百度统计

    litten的主题yilia 编辑文件 themes/yilia/_config.yml,添加一行配置,可以删除原来的google analytics baidu_tongji: true 新建 th ...

  3. map、hash_map、unordered_map 的思考

    #include <map> map<string,int> dict; map是基于红黑树实现的,可以快速查找一个元素是否存在,是关系型容器,能够表达两个数据之间的映射关系. ...

  4. MySQL自增锁模式innodb_autoinc_lock_mode参数理解调优

    前段时间某数据表运行过程中,出现自增字段突然跳跃式增长的问题,潜心研究发现,问题导致原因可能是因为并发写入导致 于是通过各种途径查阅是因为innodb_autoinc_lock_mode参数设置的不同 ...

  5. K皇后问题递归解法

      #include<iostream> #include<cmath> #include<ctime> using namespace std; bool che ...

  6. 2018年东北农业大学春季校赛 E 阶乘后的0【数论】

    链接:https://www.nowcoder.com/acm/contest/93/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  7. slam学习足迹

    1.slam入门介绍 2.齐次坐标系 3.贝叶斯滤波 均值:平均值 标准差:样本的集中程度/分散度 方差:标准差的平方 协方差:不同维度之间的关系(相关度) 协方差矩阵:多维度之间的关系(相关度) 4 ...

  8. iptables 一些有用的规则

      -A INPUT -i lo -j ACCEPT #允许本机内部访问,即回环 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许 ...

  9. Linux内核网络栈源代码分析

    http://blog.csdn.net/column/details/linux-kernel-net.html

  10. 蒙特卡洛法MATLAB

    %%unifrnd函数的使用 %unifrnd函数可以创建随机的连续均匀分布的数组,一般式为R=unifrnd(A,B); %A和B是标量或者相同维数的行向量或者列向量.R=unifrnd(A,B,[ ...