T和?的区别

news/2024/12/4 17:35:20/

Java中的Object、T(泛型)、?区别

因为最近重新看了泛型,又看了些反射,导致我对Object、T(以下代指泛型)、?产生了疑惑。

我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味着它的范围非常广!首先记住这点,如果你的参数类型时Object,那么的参数类型将非常广!

《Thinking in Java》中说很多原因促成了泛型的出现,最引人注目的一个原因就是为了创造容器类。这个要怎么来理解呢?我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是限定某种类型上来。

所以我们现在能小结一下Object和T很重要的两点区别就是:

  1. Object范围非常广,而T从一开始就会限定这个类型(包括它可以限定类型为Object)。
  2. Object由于它是所有类的父类,所以会强制类型转换,而T从一开始在编码时(注意是在写代码时)就限定了某种具体类型,所以它不用强制类型转换。(之所以要强调在写代码时是因为泛型在虚拟机中会被JVM擦除掉它的具体类型信息,这点可参考泛型,在这里不做引申)。

比如在jdk中的List类是个泛型类。现在我们制定它的类型是Object。

        List<Object> list = new ArrayList<Object>();int i = 0;String s = "s";list.add(i);list.add(s);

List本身是个泛型类,现在我们指定它接收Object类型的参数,此时就可以放置任意类型的参数进去,而在取出来是就必须得进行强制类型转换成具体的类型。

现在我们如果将List指定接收String类型的参数,那么这个List就只能放置String类型,且取出来时就不用进行强制类型转换。

这点给我们带来的启示是,在编写类似List类的时候,一定要注意是否用泛型。一定要多写几个泛型类,多讨论多理解,不然还是可能会搅在一起。


 接着是?,这个可能在用到反射需要获取Class类型时用到,它的解释就是:接收一个不确定的类型,有点和Object一样。我对它一个理解是,如果只用"?"那么它和Object是一样的,但是"?"有比Object稍微“高级”有点的用法,就是它能缩小一个不确定的范围,利用类似"? extends Test",这就意味着只接收接收Test类的继承类,是不是比Object的范围缩小了?

以上就是Object、T、?的区别。多写几行代码,多做试验,多讨论,就知道在何时何地恰当的使用了。

 

Class<T>和Class<?>有什么区别

平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下: 

? 表示不确定的java类型。
T  表示java类型。
K V 分别代表java键值中的Key Value。
E 代表Element。 

Object跟这些东西代表的java类型有啥区别呢?
Object是所有类的根类,是具体的一个类,使用的时候可能是需要类型强制转换的,但是用T ?等这些的话,在实际用之前类型就已经确定了,不需要强制转换。

追问:

也就是说,这个方法能知道返回的是哪种类型(父类),就用T行了?如果完全不知道的就用?用T的得到的对象就不需要类型转换了,而用?的就必需用强转了!

追答:

第一种是固定的一种泛型,第二种是只要是Object类的子类都可以,换言之,任何类都可以,因为Object是所有类的根基类
固定的泛型指类型是固定的,比如:Interge,String. 就是<T extends Collection><? extends Collection> 这里?代表一个未知的类型,
但是,这个未知的类型实际上是Collection的一个子类,Collection是这个通配符的上限.
举个例子
class Test <T extends Collection> { }<T extends Collection>其中,限定了构造此类实例的时候T是一个确定类型(具体类型),这个类型实现了Collection接口,
但是实现 Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,干脆还不如用
Object通用一下。
<? extends Collection>其中,?是一个未知类型,是一个通配符泛型,这个类型是实现Collection接口即可。_________________________上面讲的是什么鬼,当你知道引入通配符泛型的由来之后(下面代码由java1234.com提供)_________________________________________________________________________________________

The method take(Animal) in the type Test is not applicable for the arguments (Demo<Dog>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Cat>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Animal>)

当引入泛型之后,遇到这种情况,参数怎么写都不适合,总有2个方法不适用,为了给泛型类写一个通用的方法,这时候就需要引入了 ?通配符的概念。

 

 

public class Demo <T extends Animal>{private T ob;public T getOb() {return ob;}public void setOb(T ob) {this.ob = ob;}public Demo(T ob) {super();this.ob = ob;}public void print(){System.out.println("T的类型是:"+ob.getClass().getName());}
}

 


http://www.ppmy.cn/news/467916.html

相关文章

异步电机和永磁同步电机的区别

导读&#xff1a;本期主要介绍一下异步电机和永磁同步电机的区别&#xff0c;后面文章也会开始介绍永磁同步电机相关的控制算法。 需要本文中搭建的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。 一、异步电机介绍 图1异步电机结构图 1、优…

使用vtkWindow报错Debug Assertion Failed ... mfc140d.dll

环境&#xff1a;VS2022VTK7.1.1&#xff0c;还使用了MFC 报错信息 Debug Assertion Failed! Program: C:\WINDOWS SYSTEM32 mfc140d.dll File. D: a work 1 s src vctools VC7Libs ship ATLMFCnclude afxwin1.inLine: 21 For information on how your program can cause an a…

操作系统的发展历程

目录 1.手工操作阶段&#xff08;此阶段没有操作系统&#xff09; 2.批处理阶段&#xff08;操作系统开始出现&#xff09; 2.1单道批处理系统 2.2多道批处理系统 3.分时操作系统 4.实时操作系统 5.网络操作系统和分布式计算机 6.个人计算机操作系统 本篇主要讲述操作系…

js指定获取地址栏参数(hash地址后面)

export function getUrlHashParams(paramName: string): string | null {// const hash new URL(// https://www.xxx.com/xxx/xxx?xxxxx#/docflow/inbiz?iddocidid&dadasdas123456// ).hash.substring(1) // 去除 # 符号const hash window.location.hash.substring(1…

css 如果英文字母换行问题

如果英文字母或者和中文字母在一起的英文字符直接使用text-wrap:wrap是不起作用的。 如&#xff1a;aaaaaaaaabbbbbbbddddcccccccccccccaaaaaaaa中华人民共和国 可以使用 word-break:break-all

力扣红蓝灯算法思路( 前缀一致)

力扣红蓝灯算法思路&#xff0c; 前缀一致 题目描述思路总结算法代码 题目描述 给你一个长度为 n 、下标从 1 开始的二进制字符串&#xff0c;所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位&#xff08;即&#xff0c;将 0 变为 1&#xff09;。 给你一个下标从…

电脑上的ofd格式文件如何打开呢_OFD格式的文件怎么打开预览?,来充电吧

我们不管是在工作、学习、下载资源的时候都可能收到别人的文件&#xff0c;但是如果是word或者pfd格式还好&#xff0c;直接在电脑上就可以打开&#xff0c;但是如果是ofd格式的就很难打开了。 工具/材料 搜狗浏览器、DCS文档在线预览 操作方法 01 打开我们的搜狗浏览器&#x…

Android连上USb不充电,手机连接电脑只显示充电没有usb连接怎么办?

手机连接电脑只显示充电没有usb连接怎么办&#xff1f;我们在办公室的时候&#xff0c;经常会使用usb数据线来为手机充电&#xff0c;正常情况下&#xff0c;不仅可以充电&#xff0c;也可以连接电脑传输数据&#xff0c;然而有用户反馈说手机连接电脑只显示充电&#xff0c;这…