文档章节

Java泛型全解析

Galy_绿
 Galy_绿
发布于 2016/07/11 11:45
字数 1113
阅读 7
收藏 0

把一个对象放进集合中之后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成Object类型了

 

为了解决上面的问题,就引出了泛型这一个概念

 

泛型接口和类

public class Fruit<T> {

private T info;

 

public Fruit(T info) {

this.info = info;

}

 

public T getInfo() {

return info;

}

 

public void setInfo(T info) {

this.info = info;

}

 

public static void main(String[] args) {

Fruit<String> lt = new Fruit<String>("苹果");

System.out.println(lt.getInfo());

Fruit<Integer> intg = new Fruit<Integer>(1);

System.out.println(intg.getInfo());

}

}

 

可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,模型内部的类型由使用者自己限定

无论为泛型的类型形参传入哪一种类型的实参,对于Java来说,他们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参

 

泛型接口和类的子类

 

public class Apple extends Fruit<String>{

 

public Apple(String info) {

super(info);

}

 

@Override

public String getInfo() {

return super.getInfo();

}

 

}

 

  • 使用泛型接口或类的时候,虽然可以不加<>部分,但是推荐加上,不然还要强制类型转换等麻烦操作

  • 重写父类方法或者实现接口的时候,返回值一定要跟父类(接口)一致

 

设定类型形参的上限

 

public class Fruit<T extends String & java.io.Serializable> {

private T info;

 

public Fruit(T info) {

this.info = info;

}

 

public T getInfo() {

return info;

}

 

public void setInfo(T info) {

this.info = info;

}

 

public static void main(String[] args) {

Fruit<String> lt = new Fruit<>("苹果");

System.out.println(lt.getInfo());

Fruit<?> intg = new Fruit<>("1");

System.out.println(intg.getInfo());

}

}

 

  • 可以有多个限定条件,存在多个限定条件的时候,使用&连接

  • 至多一个父类上限,多个接口上限

  • 接口上限要在类上线后面

 

类型通配符

 

使用类型通配符的类是各种该类的泛型的父类

 

public class Fruit<T> {

private T info;

 

public Fruit(T info) {

this.info = info;

}

 

public T getInfo() {

return info;

}

 

public void setInfo(T info) {

this.info = info;

}

 

public static void main(String[] args) {

Fruit<String> lt = new Fruit<>("苹果");

System.out.println(lt.getInfo());

Fruit<?> intg = new Fruit<>(1);

System.out.println(intg.getInfo());

}

}

 

  • 在Java 7以后可以使用菱形语法,在构造器后不需要完整的泛型信息

  • ?”用于操作具体的某个泛型类的时候,还未确定最终使用时,采用的对象类型,就用问号作为占位的含义

 

通配符的上限设定

 

Fruit<? extends String> intg = new Fruit<>("1");

 

  • 使用extends的方式限定?必须是String类型或者是其子类类型

 

通配符的下限设定

 

static <T,B> void getCollection(Fruit<? super T>b){

System.out.println(b);

}

 

  • 一定要是T或者T的父类

 

泛型方法

 

修饰符<T,S>返回值类型 方法名(形参列表){

 

方法体

 

}

 

static <T,B> void getCollection(B[]b,Collection<T> c){

 

}

 

  • 多个类型形参之间用逗号分隔

  • 所有类型形参声明放在修饰符和方法返回类型之间

  • 方法中定义的类型形参只能在该方法里使用,而接口或类中定义的类型形参可以在整个接口、类中使用

  • 方法中的泛型参数无需显式传入实际类型参数

 

public class Fruit<T extends String & java.io.Serializable> {

private T info;

 

public Fruit(T info) {

this.info = info;

}

static <T,B> void getCollection(B[]b){

System.out.println(b);

}

public T getInfo() {

return info;

}

 

public void setInfo(T info) {

this.info = info;

}

 

public static void main(String[] args) {

Fruit.getCollection(new String[]{"1"});

}

}

 

  • 存在泛型构造器,不能使用”菱形“语法

 

泛型方法与类型通配符的区别

 

  • 泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系,如果没有这样的类型依赖关系,就不应该使用泛型方法

  • 类型通配符既可以在方法签名中定义形参的类型,也可以用于定义变量类型,但泛型方法中的类型形参必须在对应方法中显式声明

 

擦除和转换

 

擦除

 

当把一个具有泛型信息的对象赋值给另一个没有泛型信息的变量时,尖括号中的泛型信息就会被擦除扔掉

 

转换

 

当把一个没有泛型信息的对象赋值给另一个泛型信息的变量时,不会发生报错,会自动转换

本文转载自:http://zoeminghong.github.io/2016/05/25/generic20160525/

共有 人打赏支持
上一篇: 谈谈Java内存管理
下一篇: 决策树
Galy_绿
粉丝 12
博文 133
码字总数 14908
作品 0
海淀
私信 提问
Kotlin 泛型 VS Java 泛型

建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言中较难理解的一个部分。Kotlin 泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪...

JohnnyShieh
2018/06/11
0
0
Spring 中好用的泛型操作API

随着泛型用的越来越多,获取泛型实际类型信息的需求也会出现,如果用原生API,需要很多步操作才能获取到泛型,比如: ParameterizedType parameterizedType = (ParameterizedType) ABServic...

宇的季节
2018/06/06
0
0
Java编程学习之泛型方法的了解 java开发

Java泛型方法和泛型类支持程序员使用一个方法指定一组相关方法,或者使用一个类指定一组相关的类型。 Java泛型是JDK 5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序...

老男孩Linux培训
2018/05/29
0
0
提给程序员和开发者的 10 道 Java 泛型面试题

关于泛型的面试题在 Java面试中变得越来越常见,因为 Java 5问世已经有相当长的时间了,越来越多的应用已经迁移到Java 5上来了,并且几乎所有新的Java开发工作也都是在Tiger(Java 5的项目代号...

lwei
2013/10/18
13.2K
30
Cannot make a static reference to the non-stati...

今天碰到这样一些错误,Eclipse提示Cannot make a static reference to the non-static type T。代码如下: public class DAOFactory<D extends TemplateDAO<B>, B> {private static Map<Str......

开源中国驻成都办事处
2013/05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
4
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部