关于java中的泛型 T 和 ?的区别(转载+改动)

2023-11-01

T表示泛型,new的时候要加入泛型,更方便通用
? 表示不确定的类型,一般用在通配

Object表示java中所有类的父类,在集合中使用时要格外注意。
jdk为了便于理解,用K表示键,V表示值,T表示type类型,E表示enum枚举,其实这四个都只是符号,都是表示泛型名称。换成其他字母都没关系,但是都要在之前声明。

下面介绍一个小demo

package Twenty_two.May_2022.generic_programming;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 查阅jdk1.8 api文档,找到下面两个方法的声明,api中是都没写出详细方法体的
 * public final Class<?> getClass()
 * public String getName()
 * 由第59行可以看出,Xxx.class和 xx.getClass()的返回值是一模一样的(包括类型)注释:(Xxx为类型,xx为由Xxx定义的变量)
 * 此外Xxx.class还可以进一步调用.getClass()方法,但是不可以进一步获取.class属性了。
 */


//虽然Test<T1,T2>,但类名字仍为Test。T1,T2只是告诉我们new的时候要加入泛型,更方便通用
//T1,T2可以任意定义,比如改成K,V都可以
//他们不会关联到其他类,只是在本类中通用
public class Test<T1, T2> {
    public static void main(String[] args) {
        System.out.println(new Test().getT1()); //T1
        System.out.println(new Test().getT2()); //T2
        new Test<String, String>().getClassName(""); //第四行输出 java.lang.String 第五行输出 []
        //T1,T2在new的时候用到,这里都为String,在类的主函数中当然可以定义类的实例!!
        new Test().getClassAndList(Integer.class); //java.lang.Class
        //HashMap的括号里面不能是T,E,T1,T2等不确定的东西,但可以是?
        HashMap<?, ?> map = new HashMap<Object, String>();
        List<?> list = new ArrayList<String>();

        System.out.println("----------");

        System.out.println( ( (new Object[3]).getClass().getName() ) ); // [Ljava.lang.Object;
        Object []obj = new Object[4];
        System.out.println( ( obj.getClass().getName() ) ); // [Ljava.lang.Object;

        System.out.println();

        System.out.println(String.class); // class java.lang.String
        System.out.println(String.class.getClass()); // class java.lang.Class
        System.out.println(String.class.getName()); // java.lang.String

        System.out.println();

        System.out.println(Integer.class); // class java.lang.Integer
        System.out.println(Integer.class.getClass()); // class java.lang.Class
        System.out.println(Integer.class.getName()); // java.lang.Integer

        System.out.println();

        Integer a = 1;
        System.out.println(a.getClass()); // class java.lang.Integer
        System.out.println( a.getClass().equals("java.lang.Integer") );//false
        //System.out.println( a.getClass() == "java.lang.Integer" );
        //Operator '==' cannot be applied to 'java.lang.Class<capture<? extends java.lang.Integer>>', 'java.lang.String'
        System.out.println( a.getClass() == Integer.class );//true
        System.out.println(a.getClass().getName()); // java.lang.Integer
//        System.out.println(Integer.getClass());//报错 Non-static method 'getClass()' cannot be referenced from a static context
    }

    public T1 getT1() {
        //这里的“T1”替换成1或1.0都会报错
        return (T1) "T1";

    }

    public T2 getT2() {
        //将自动转型为String
        return (T2) "T2";

    }

    public <T> void getClassName(T x) {
        //<T>必须放在void或者返回类型的前面
        System.out.println(x.getClass().getName()); //第三行输出 java.lang.String
    }

    public <T> Class<?> getClassAndList(Class<?> a) {
        //当两个都是Class<?>,参数中的?自动通配成T
        //Class<T>前面缺少<T>必须定义,否则将出现编译错误
        //T改成其他字母都可以,但一定要声明
        // 返回类型和参数中的类型:Class<T>和Class<?>都可以。a的类型为Class<T>,而Class<?>可以通配
        System.out.println(a.getClass().getName());//传入的a是一个类,Class类型 //第四行输出 java.lang.Class
        //参数里面的Class<T>最大的好处是如果方法里面定义了泛型,可以自动获取类型值,比如如下的List<T>可以自动获取到a的类型,不必强调死
        List<?> b = new ArrayList<T>();
        //List<?> b = new ArrayList<?>();会报错,以为ArrayList必须是一种类型,List<>起到通配的作用
        //List<T> b = new ArrayList<T>();当然正确
        System.out.println(b); //第5行输出、[]
        return a;
    }
}


版权声明:本文为CSDN博主「老周聊架构」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于java中的泛型 T 和 ?的区别(转载+改动) 的相关文章

  • 在 catch 块中重新抛出异常是否有意义?

    从 catch 块中抛出异常只是为了记录消息以便我们确定导致异常的原因是否有意义 Code public void saveLogs Logs logs throws RemoteException try LogsOps saveLogs
  • JDT - 尝试更改类型的超类。我不知道超级类的限定名称

    我有一个程序 除其他任务外 还必须使用 JDT 更改某些类的超类 我有两个字符串 其中包含要交换的超类的限定名称 例如 org example John 和 org example Smith 并且我正在解析整个 AST 搜索扩展这些类的类
  • 从字符串中删除多个子字符串 - Java

    我需要从给定字符串中删除多个子字符串 例子 String exclude one two three String input if we add one and two we get three 我希望我的程序从输入字符串中删除所有出现的
  • SWT:如何进行高质量图像调整大小

    我的应用程序需要调整 ImageData 的大小 不幸的是 我还没有通过 GC 开启抗锯齿和高插值 或 ImageData scaledTo 获得我想要的结果 生成的图像质量太低 无法接受 进行高质量 ImageData 调整大小的最佳方法
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • 如何通过两跳 SSH 隧道使用 JProfiler

    我正在尝试将 JProfiler 连接到在我将调用的服务器上运行的 JVMremote 该服务器只能从我的工作站访问 local 通过我将调用的另一台服务器middle 我的计划是将 JProfiler 连接到remote是这样的 安装 J
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • 当对话框打开时如何处理屏幕方向变化?

    我有一个 Android 应用程序 它已经在处理方向的更改 即有一个android configChanges orientation 在清单和onConfigurationChange 活动中的处理程序切换到适当的布局并准备它 我有一个横
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • Spark java:如何处理多部分/表单数据输入?

    我在用spark http sparkjava com 开发网络应用程序 当我想上传文件时出现问题 public final class SparkTesting public static void main final String a
  • 如何在 iText 7 中创建页面大小不等的文档

    如何在 iText 7 中创建页面大小不等的文档 iText7 可以吗 在iText5中 我使用document setPageSize and document newPage 如果您通过高级 API 添加内容 Document add
  • 如何管理一个 JInternalFrame 调用另一个 JInternalFrame?

    我有一个带有此代码的 JDesktopPane public class Menu extends JFrame implements ActionListener Creates new form Portada public stati
  • 如何在 VSCode 中热重载 Tomcat 服务器

    我正在从 Eclipse IDE VSCode 分别用于编码 Java servlet 和 HTML CSS JS 网页 迁移到仅使用 Visual Studio Code 因为它的轻量级 我为 VSCode 安装了几个 Java 扩展 R
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 旧的和奇异的 JVM 上 java.io.BufferedInputStream 的默认缓冲区大小是多少?

    我一直在为一篇关于以下内容的博客文章进行一些研究java io BufferedInputStream和缓冲区 显然 多年来 默认值已从区区 512 字节增长到 8192 字节 冒昧地 Sun 的 Java 7 实现 甚至在JDK 1 1

随机推荐

  • JavaScript洗牌函数

    喜欢做笔记 洗牌函数的封装 function getRandom min max return Math floor Math random max min 1 min function shuffle arr 不修改原数组 let arr
  • 公积金提取 -- 小黑日常超详细教程

    公积金说明 是入职以后五险一金中的一金 它的产生是国家给予的福利 国家规定它的缴纳数组成是 工资的6 12 然后按照公司给予福利的6 12 区间值计算 公积金存款 公司缴纳的百分比 x 你的工资 x 2 注 正经公司会根据实际发给你的工资计
  • 背完这444句,你的口语绝对不成问题了

    1 I see 我明白了 2 I quit 我不干了 3 Let go 放手 4 Me too 我也是 5 My god 天哪 6 No way 不行 7 Come on 来吧 赶快 8 Hold on 等一等 9 I agree 我同意
  • 公共数据运营模式研究报告 附下载

    本报告以公共数据运营模式为核心 以释放公共数据价值为目标 深入分析公共数据概念及特征 厘清公共数据运营的内涵及本质 提出纵深分域数据要素市场运营体系的总体思路 构建了一座 一个数据底座 两场 两级市场 三域 三个区域 四链 四个链条 的运营
  • Vue(踩坑)Error in render “TypeError Cannot read properties of undefined (reading ‘length‘)“

    我在网上搜了好久 说是我层级太深了 taskfillist我在vuex中的state中定义的是一个空数组 div 解决办法 在组件mounted过程中 taskfillist声明的空数组 在taskfillist length前面增加tas
  • MERN堆栈

    转自GeeksforGeeks的 Jasraj MERN Stack 翻译 MERN堆栈 MERN堆栈 是一个 Javascript 堆栈 用于更轻松 更快速地部署全栈Web应用程序 MERN堆栈包含 4 项技术 即 MongoDB Exp
  • 基于LIRI数据集的R语言探索:优化分析和可视化技巧

    基于LIRI数据集的R语言探索 优化分析和可视化技巧 引言 在数据科学和数据分析领域 R语言一直以来都是最受欢迎的工具之一 本文将使用LIRI数据集作为案例 介绍如何使用R语言进行数据分析和可视化 我们将涵盖数据清洗 特征提取 探索性数据分
  • 【matlab】中取矩阵的某一行某一列

    1 操作指令 取某一行 Ki K i 取某一列 Kj K j 取某几行 Kij K i j 取某几列 Kij K i j i和j表示行数和列数 2 举例分析 例如矩阵K 1 2 3 4 5 6 7 8 9 三行三列 K 1 2 3 4 5
  • 【C语言】指针题及解析

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 例一 需要考虑大小端问题 该例仅限32位平台 小端存储模式 in
  • requests.post()提取返回数据中的具体某个数值

    返回json数据是这样的 提取返回code rsp requests post url data jsonData headers headers timeout 3 json code rsp code if code 1000 prin
  • VRF配置

    SW 2既作为集团核心交换机 同时又使用相关技术将SW 2模拟为Internet交换机 实现集团内部业务路由表与Internet路由表隔离 那位大神能教教我这道题目要怎么做啊 转载于 https blog 51cto com 1432192
  • iOS开发之网络监听(二)SCNetworkReachability

    文章目录 判断当前网络是否可达 第一个参数 SCNetworkReachabilityRef类型的target 第二个参数 SCNetworkReachabilityFlags类型的flags SCNetworkReachability是S
  • 一个基于@DS动态数据库的Java远程数据库同步程序

    同步程序开发文档 一 开发目标 本程序为一同步程序 DAO层连接2个数据库 远程直连一个orcal数据库 读取数据后存入本地的mogdb数据库 两个数据库访问通过 DS 动态数据库切换 通过定时任务调用同步类 并保存同步日志到数据库 二 程
  • React Antd 前端生成cron表达式

    不知道你在玩游戏的时候是否发现过以下情况 1 玩某些游戏的时候 发现他的排行榜并不是时时更新的 而是每半个小时 或者一个小时更新一次 2 又比如很火的王者荣耀手游 它的日常任务 都是每天5点进行更新 那么 这些时间控制 到底是由谁控制得如此
  • 拼接json和数组

    function form2Json id var arr id serializeArray var jsonStr jsonStr for var i 0 i lt arr length i jsonStr arr i name arr
  • 如何做代码评审(code review)

    1 定义 Code Review 即日常所说的代码评审或代码回顾 主要是在软件开发的过程中 对功能源代码进行评审 其目的是找出并修正软件开发过程中出现的错误的过程 提高和改进代码质量的过程 2 目的 2 1 提前发现缺陷 code revi
  • 电阻的固有噪声(热噪声)

    电阻的固有噪声是指其自身产生的噪声 包括热噪声和过剩噪声 热噪声亦称白噪声 是由导体中电子的热震动引起的 它存在于所有电子器件和传输介质中 它是温度变化的结果 但不受频率变化的影响 热噪声是在所有频谱中以相同的形态分布 它是不能够消除的 由
  • css怎么跟html搞一起,css和html的四种结合方式

    1 在每个HTML标签上面都有一个属性 style 把css和HTML结合在一起 我是一只小小鸟 2 使用HTML的一个标签实现 css代码 div background color red color gray 3 在style标签里面
  • Java实现多线程下载文件

    这是本人在实际开发当中遇到的多线程下载文件并记录下来 public class DownloadUtil private String pathFile private String strFile private DownloadThre
  • 关于java中的泛型 T 和 ?的区别(转载+改动)

    T表示泛型 new的时候要加入泛型 更方便通用 表示不确定的类型 一般用在通配 Object表示java中所有类的父类 在集合中使用时要格外注意 jdk为了便于理解 用K表示键 V表示值 T表示type类型 E表示enum枚举 其实这四个都