泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候就可以使用泛型

泛型也可以看出是一个变量,用来接受数据类型

  E e :Element 元素

  T t: Type 类型

/*
Collection<E> extends Iterable<E>,所有单鞋集合恶斗可以使用增强for public interface Iterable<T>
实现此接口允许对象成为“for-each loop”语句的目标。 增强for循环,用来遍历结合和数组
格式:
for(集合/数组的数据类型 变量名:集合名/数组名){
sout(变量名)
}
*/
 /*
使用泛型
避免类型转换的满分,存储时什么类型,出去就是什么类型
运行期间异常,提到编译期的异常
*/ ////创建集合对象,不用泛型
// 集合不使用泛型,默认的类型是object类型,可以存储任意类型的数据
// 不安全,会引发异常
public class DemoFor {
public static void main(String[] args) {
show1();
show2();
} /*
使用泛型
避免类型转换的满分,存储时什么类型,出去就是什么类型
运行期间异常,提到编译期的异常
*/
private static void show2(){
ArrayList<String> list = new ArrayList<>();
list.add("BBB");
Iterator<String> it = list.iterator();
while (it.hasNext()){
String s = it.next();
// int i= it.next().length();不能进行流式编程
System.out.println(s);
System.out.println(s.length());
}
} ////创建集合对象,不用泛型
// 集合不使用泛型,默认的类型是object类型,可以存储任意类型的数据
// 不安全,会引发异常
private static void show1(){
ArrayList list = new ArrayList();
list.add("DDDD");
list.add(1); // 迭代器遍历
Iterator it =list.iterator();
while (it.hasNext()){
Object obj = it.next();
System.out.println(obj);
// 想要使用String类特有的方法,length获取字符串的长度,
// 现在不能使用,因为多态 object obj = "obj" 不能使用子类特有的方法
// 需要向下转型 String s = (String)obj;
//// 会抛出异常ClassCastException,不能把Integer类型转换为String类型
// String s = (String)obj;
// System.out.println(s.length());
} }
}
/*
DDDD
1
BBB
3 */

自定义泛型:

自定义一个泛型类:

/*
定义含有泛型的类,模拟ArrayList
泛型是一个位置的数据类型,当我们不确定什么数据类型的时候,可以使用泛型
泛型可以接受任意数据类型,可以使用String ,Integer
创建对象的时候确定泛型的数据类型
*/
public class Gennerice<E> {
private E name; public E getName() {
return name;
} public void setName(E name) {
this.name = name;
}
}

实例化:

public class GenericeDo {
public static void main(String[] args) {
// 不写泛型,默认是objcet
Gennerice gc = new Gennerice();
gc.setName("dddd");
Object obj = gc.getName(); // 创建对象,使用泛型Intager
Gennerice<Integer> gc2 = new Gennerice<>();
gc2.setName(999);
Integer name = gc2.getName();
System.out.println(name); // 使用字符串类型
Gennerice<String> gc3 = new Gennerice<>();
gc3.setName("RRRR");
String name2 = gc3.getName();
System.out.println(name2);
}
}

含有泛型的方法

/*
定义含有泛型的方法,泛型定义在修饰符和返回值之间
格式:
修饰符 <泛型> 返回值类型 方法名 (参数列表(使用泛型)){
方法体
}
含有泛型的方法,在调用方法的时候确定泛型的数据类型,传递什么类型的参数,泛型就是什么类型 */
public class GenericMethod {

    public <M> void  methon(M m){
System.out.println(m);
} // 含有泛型的静态方法:
public static <S> void methon2(S s){
System.out.println(s);
}
}

测试:

public class GmTest {
public static void main(String[] args) {
GenericMethod gm = new GenericMethod();
// 调用泛型方法,传递什么类型就是什么类G型
gm.methon(10);
gm.methon("ddd"); gm.methon2("静态方法的调用,不建议创建对象使用"); // 静态方法,通过类名.方法名 直接调用
GenericMethod.methon2(999);
GenericMethod.methon2("quan");
}
} /*
10
ddd
静态方法的调用,不建议创建对象使用
999
quan
*/

含有泛型的接口

public interface GenerInterface<I> {
// 抽象函数
public abstract void method(I i); }

第一种使用方式:

/*
含有泛型的接口:第一种:定义接口的实现,指定接口的泛型
*/
public class GenInterTest implements GenerInterface<String> {
@Override
public void method(String s){
System.out.println(s);
} }

第二种使用方式:

/*
第二种使用方式,
接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
相当于定义了一个含有泛型的类,实现对象的时候觉得泛型的数据类型
*/
public class GenInterTest2<I> implements GenerInterface<I>{
@Override
public void method(I i) {
System.out.println(i);
} }

测试:

public class GenInterTestALl {
public static void main(String[] args) {
GenInterTest git = new GenInterTest();
git.method("done"); //
GenInterTest2<Integer> git2 = new GenInterTest2<>();
git2.method(111); GenInterTest2<String> git3 = new GenInterTest2<>();
git3.method("WUQN");
}
}
/*
done
111
WUQN
*/

泛型通配符:

泛型的上限限定:

java的泛型hei的更多相关文章

  1. [改善Java代码]Java的泛型是类型擦除的

    泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generi ...

  2. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  3. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  4. Java 泛型 Java使用泛型的意义

    Java 泛型 Java使用泛型的意义 @author ixenos 直接意义 在编译时保证类型安全 根本意义 a) 类型安全问题源自可复用性代码的设计,泛型保证了类型安全的复用模板 b) 使用复用性 ...

  5. 跟着刚哥梳理java知识点——泛型(十三)

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  6. 【Java】泛型学习笔记

    参考书籍 <Java核心技术:卷1> 泛型, 先睹为快 先通过一个简单的例子说明下Java中泛型的用法: 泛型的基本形式类似于模板, 通过一个类型参数T, 你可以"私人定制&qu ...

  7. [转] Java 的泛型擦除和运行时泛型信息获取

    原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...

  8. Java 容器 & 泛型:五、HashMap 和 TreeMap的自白

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Java 容器的文章这次应该是最后一篇了:Java 容器 系列. 今天泥瓦匠聊下 Maps. 一.Ma ...

  9. 【译】9. Java反射——泛型

    原文地址:http://tutorials.jenkov.com/java-reflection/generics.html ===================================== ...

随机推荐

  1. Clickhouse 分布式表&本地表

    CK 分布式表和本地表 ck的表分为两种: 分布式表 一个逻辑上的表, 可以理解为数据库中的视图, 一般查询都查询分布式表. 分布式表引擎会将我们的查询请求路由本地表进行查询, 然后进行汇总最终返回给 ...

  2. 给bootstrap-table填坑

    由于设计变更,需要把数据由分页展示改为全部展示(才3500条数据),结果chrome浏览器页面卡顿,火狐浏览器直接卡死! console.time分析之后,竟然是bootstrap-table插件的坑 ...

  3. JAVA的对象和封装及static与final的用法(详解)

    一:软件出现的目的 1:用计算机的语言描述现实世界 2:用计算机解决现实世界的问题 编程思维:  使用面向对象的思想(描述)面向对象的世界     (符合人类的思维习惯) 二:面向对象设计和开发程序的 ...

  4. 07-Spring整合Mybatis

    Spring之整合Mybatis 整合核心思路 由很多框架都需要和Spring进行整合,而整合的核心思想就是把其他框架所产生的对象放到Spring容器中,让其成为Bean. 比如Mybatis,Myb ...

  5. WPF子窗体

    效果: 1. 点击WPF主窗体上的一个按钮,弹出子窗体, 2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体. 1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体Ch ...

  6. 矩池云上使用Visdom可视化图像说明

    租用机器添加默认端口 点击展开高级选项 点击添加端口配置 添加Visdom默认端口,选择 http 端口填入 8097 进入环境安装并使用 JupyterLab 链接 是本次实验用来安装实验的工具 H ...

  7. vcpkg 换源

    vcpkg 的下载速度饱受诟病已久,但是并不见官方团队的动作,虽然有人提了 issue,但是提交的代码并不符合要求. 我自己在下载包的时候,特别是在下载位于 github 的包时,下载直接中断,所以我 ...

  8. Vue3中setup语法糖学习

    目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...

  9. laravel 框架资源路由

  10. 微信小程序授权登录将open_id传至后台并入库

    要求能把用户昵称.头像以及open_id写入数据库,服务端保持用户登录状态 wxml: <block wx:else> <button type="primary" ...