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

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

  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. [Matlab]求解线性方程组

    转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方 ...

  2. 三大数据库 sequence 之华山论剑 (中篇)

    sequence 用法四 AUTO INCREMENT 通过 DEFAULT 还是需要手动创建 sequence.有没有更简单的用法呢? 当然,就是通过 AUTO INCREMENT 方式,自动创建 ...

  3. golang监听rabbitmq消息队列任务断线自动重连接

    需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...

  4. C语言中如何输出汉字;如何用C语言汉字编码输出汉字(超全版)

    目录 前景提要 方式一: 方式二: 1. 数组方式打印 2. 指针方式打印 3. 优化为while方式 方式三: 1. 使用结构体内数组方式 2. 使用结构体内数组指针方式 (1) 基础写法 (2) ...

  5. 小白文-SpringMVC-解读DispatcherServlet源码

    SpringMVC 学习完Spring框架技术之后,差不多会出现两批人: 一批是听得云里雾里,依然不明白这个东西是干嘛的: 还有一批就是差不多理解了核心思想,但是不知道这些东西该如何去发挥它的作用. ...

  6. Bugku CTF_web5

    1.打开网页,得到信息如下 2.打开hackbar,在body里传入post参数. 3.得到flag如下 4.主要考察以下几点: ->php无论是通过get请求还是post请求得到的数据都是字符 ...

  7. CF578D题解

    LCS 为给定串的长度减一,考虑枚举一个区间 \([L,R]\),表示 \(S\) 和 \(T\) 的长度为 \(L-1\) 的前缀完全相同以及长度为 \(n-R\) 的后缀完全相同,且没有比这个前缀 ...

  8. 【ASP.NET Core】MVC 控制器的模型绑定(宏观篇)

    欢迎来到老周的水文演播中心. 咱们都知道,MVC的控制器也可以用来实现 Web API 的(它们原本就是一个玩意儿),区别嘛也就是一个有 View 而另一个没有 View.于是,在依赖注入的服务容器中 ...

  9. 【elasticsearch】搜索过程详解

    elasticsearch 搜索过程详解 本文基于elasticsearch8.1.在es搜索中,经常会使用索引+星号,采用时间戳来进行搜索,比如aaaa-*在es中是怎么处理这类请求的呢?是对匹配的 ...

  10. Mybatis中Log4j日志的使用

    参考资料: (1). 百度百科:https://baike.baidu.com/item/log4j/480673?fr=aladdin (2). B站狂神的视频:https://www.bilibi ...