JAVA基础之泛型

像List代表了只能存放String类型的对象的List集合。在java中这样用:

//创建一个只能存放String类型的List集合

List

想知道为什么使用泛型,我们可以看看没有泛型之前,是怎么操作集合的。

public static void main(String[] args){

//定义集合

Map map=new HashMap();

//存入元素

map.put(“hello”,”你好”);

map.put(“how are you”,”吃了没”);

//取出元素

System.out.println((String) map.get(“hello”));

System.out.println((String) map.get(“how are you”));

因为集合是弱类型的,所以把对象放进集合时,没有进行检查,即使将一个int类型的数据放入String类型的集合中,在编译时期也不报错。只有在运行时才会爆出ClassCastException的异常。这是第一个不方便之处。注:【编译期:在eclipse中保存代码的那一刻。运行期:运行run,将代码启动起来】

在集合中取出元素后,如果要使用,还需对其进行类型转换,这是第二个不方便之处。

为了解决以上两个不方便之处,我们可以使用泛型。泛型能让集合”记住”其元素的数据类型,当存入不同类型的元素时,就会以”红波浪线”的形式报错。

下面我们将上述代码用泛型改写一下:

public static void main(String[] args){

//定义集合

Map

//存入元素

map.put(“hello”,”你好”);

map.put(“how are you”,”吃了没”);

//取出元素

System.out.println( map.get(“hello”));

System.out.println(map.get(“how are you”));

所以,泛型的好处是:

• 能够在编译时检查类型安全

• 所有的强制转换都是自动和隐式的,取出代码后,不用再进行强制类型转换

不光是在集合类中可以使用泛型,在自定义类,接口,方法中也能使用泛型。下面来举例在自定义类中怎么使用泛型。

public class Apple

//使用T类型定义实例变量

private T info;

public T getInfo(){

return this.info;

public void setInfo(T info){

this.info=info;

public static void main(String[] args){

//传给T形参的是String,所以构造器参数只能是String

Apple

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

//同理,传给T形参的是Double

Apple

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

类型通配符就是使用?代替具体的类型参数。例如List在逻辑上是List,List等所有List

public class GenericTest {

public static void main(String[] args) {

List

List

List

name.add(“icon”);

age.add(18);

number.add(314);

getData(name);

getData(age);

getData(number);

public static void getData(List data) {

System.out.println(“data :” + data.get(0));

(1)设定类型通配符的上限——父类

如果使用List,表明这个list集合可以是任何泛型list的父类。如果只希望List是某一类泛型List的父类,则可以使用类型通配符的上限这个语法。此处的”上限”指的是”父类”。

具体使用思路

先定义Number的子类One、Two,然后就可以用代表List

只能从集合中取元素,不能向集合中添加元素。因为java不允许把对象放进一个未知类型的集合中。

(2)设定类型通配符的下限——子类

为了支持类型型变。比如One是Number的子类,当程序需要一个A变量时,程序可以将A

只能从集合中添加元素,如果是取出元素的话,元素都会被当成Object类型处理。

Original: https://www.cnblogs.com/zhuxiaopijingjing/p/12978520.html
Author: 幽暗森林之猪大屁
Title: JAVA基础之泛型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538207/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux 与 windows 挖门罗币总结

    比特币之前一直很火,初次了解的时候才2000RMB一枚..看不懂哇,错失良机…当然了,看得懂也不买不起..当时还是穷学生. 最近又一直看到黑客利用linux漏洞挖门罗币…

    Java 2023年6月16日
    087
  • MySQL的优化

    字符串char 定长字符串如 char(8) 低于8个,剩下的用空格填充,高于8个,报异常varchar 不定长字符串如 varchar(8)低于8个,经历收缩过程,变为实际大小….

    Java 2023年6月6日
    0114
  • 反射的印象1

    Class类与 java.lang.reflect 类库一起对反射的概念进行支持。 可以通过反射获取某个并不在你的程序空间中对象的引用。例如序列化,javaBean Origina…

    Java 2023年6月5日
    095
  • Java匿名内部类只可使用一次的理解

    匿名内部类只能使用一次,就不能在使用。 为了验证”只能使用一次”的实际含义,首先在程序中实例化了两个对象。并且在相应的类中加入了实现接口的匿名内部类: pa…

    Java 2023年6月9日
    078
  • JDK1.7-HashMap原理

    JDK1.7 HashMap JAVA技术交流群:737698533 如何在源码上添加自己的注释 打开jdk下载位置 解压src文件夹,打开idea, ctrl+shift+alt…

    Java 2023年6月6日
    095
  • [学习笔记] Java枚举

    在Java中,枚举是一种特殊的类,一般用于表示一组常量; 定义枚举时使用 enum关键字,各个常量使用逗号分隔; 也可以在类的内部定义枚举: 每个枚举都以内部类的形式实现,且所有的…

    Java 2023年6月5日
    085
  • java 规则引擎资料汇集

    ibm的developworks中较早的一篇关于规则引擎的文章 https://www.ibm.com/developerworks/cn/java/j-java-rules/ 一…

    Java 2023年5月29日
    098
  • 修罗恋汉化 空见 华夜对话就没有响应解决方法

    汉化补丁: http://blog.csdn.net/luozhuang/article/details/6524434 和黑衣MM ,也就是空见 华夜对话程序没有响应。 解决方法…

    Java 2023年5月29日
    0110
  • fastposter v2.8.3 发布 电商海报生成器

    fastposter v2.8.3 发布 电商海报生成器 🔥🔥🔥 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发。贰维🐴海…

    Java 2023年6月5日
    077
  • ThreadLocal

    1. 简介 _ThreadLocal_是Thread的局部变量,用于编写多线程程序,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。 能干什么: 存储数据 & …

    Java 2023年6月7日
    079
  • python线程同步原语–源码阅读

    前面两篇文章,写了python线程同步原语的基本应用。下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的。 相关文章链接:pyth…

    Java 2023年6月14日
    0110
  • Java 桥接方法

    桥接方法概念 Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法。可以通过使用Java反射中 Method 类的 isBr…

    Java 2023年5月29日
    085
  • 多线程(匿名内部类的方式实现多线程—定时器的使用—多线程常见的面试题)

    /* 匿名内部类的格式:* new 类名或者接口名() {* 重写方法;* };* 本质:是该类或者接口的子类对象。/ 定时器的概述和使用 * 定时器:可以让我们在指定的时间做某件…

    Java 2023年6月5日
    075
  • 前端(Css学习) 2

    层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言…

    Java 2023年6月5日
    096
  • CTF中常见密码学

    前言 参考,我们任课老师的WORD和PPT,结合自己的理解,在结合网上文章的理解。 一.BASE64编码 BASE64编码中,特征和所拥有的字符 字&…

    Java 2023年6月13日
    074
  • 基于微前端qiankun的多页签缓存方案实践

    作者:vivo 互联网前端团队- Tang Xiao 本文梳理了基于阿里开源微前端框架qiankun,实现多页签及子应用缓存的方案,同时还类比了多个不同方案之间的区别及优劣势,为使…

    Java 2023年6月15日
    0111
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球