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)

大家都在看

  • Hyperledger Fabric 2.x 动态更新智能合约

    一、说明 在上一篇文章中分享了智能合约的安装与使用,如果业务有变更代码需要修改怎么办呢?本文分享如何对已安装的合约进行版本更新。 二、环境准备 区块链网络安装:《Hyperledg…

    Java 2023年6月6日
    075
  • 6、接口调试工具

    下面模拟手机微信 向公众号发信息 测试结果: Original: https://www.cnblogs.com/weiapro/p/7732113.htmlAuthor: 天涯越…

    Java 2023年6月13日
    069
  • Java开发笔记(一百四十)JavaFX的选择框

    与Swing一样,JavaFX依然提供了三种选择框,它们是复选框CheckBox、单选按钮RadioButton、下拉框ComboBox,分别说明如下: 一、复选框CheckBox…

    Java 2023年6月6日
    079
  • idea快捷键指南:让你开发效率蹭蹭蹭的上涨

    一文让你开发效率蹭蹭蹭的上涨(idea快捷键指南) 没有写使用说明的就表示没有特别的注意事项直接用就可以了。 Ctrl + Shift + A 说明:IDEA 把所有的可以执行的操…

    Java 2023年6月5日
    067
  • 10分钟搞定 Java 并发队列好吗?好的

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT und…

    Java 2023年6月5日
    080
  • 以太坊虚拟机(EVM)

    “State”(状态)是指在任何时间点有关系统的信息。在以太坊中,状态指的是特定时刻存在的地址、账户余额和智能合约代码。每个事务都会导致以太坊的状态发生变化…

    Java 2023年5月30日
    067
  • 【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目

    前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该…

    Java 2023年6月9日
    080
  • Spring Boot+Mybatis 配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在 SpringBoot中也可以实现多数据源并配合 Mybat…

    Java 2023年5月30日
    077
  • 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。 本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用—…

    Java 2023年6月15日
    053
  • java常见面试题及答案

    1.什么是Java虚拟机?为什么Java被称作是”平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编…

    Java 2023年5月29日
    046
  • Spring:基于注解的MVC程序示例

    首先创建一个 controller类 import org.springframework.stereotype.Controller; import org.springfram…

    Java 2023年5月30日
    077
  • Spring AOP 切点切面

    Spring AOP 切点切面 https://www.jianshu.com/p/94879042db88 https://www.jianshu.com/p/994027425…

    Java 2023年5月30日
    070
  • nginx去掉inde.php方法

    /** * 打开nginx配置文件nginx.conf,添加以下内容 * 注意层级,在 http{ server { location { #这里添加 } } } 添加 */ lo…

    Java 2023年5月30日
    066
  • Redis入门讲解(介绍、安装、常用命令)

    Redis入门讲解(介绍、安装、常用命令) Redis是非关系型数据库 关系型数据库 关系型数据库是采用了关系模型来组织数据的数据库,以行和列的形式存储数据,由二维表及其之间的关系…

    Java 2023年6月15日
    071
  • 教学日志:javaSE-面向对象2

    一、局部变量和成员变量 package class4.oop1; /** * @Auther: Yu Panpan * @Date: 2021/12/10 – 12 – 10 – …

    Java 2023年6月5日
    087
  • springboot mybatis plus多数据源轻松搞定 (上)

    在开发中经常会遇到一个程序需要调用多个数据库的情况,总得来说分为下面的几种情况: 下面针对第一种情况,提供一个解决方案。 因为两个数据库的功能和结构不一样,所以可以根据功能和结构把…

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