首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

因为最近重新看了泛型,又看了些反射,导致我对Object、T(以下代指泛型)、?产生了疑惑。...《Thinking in Java》中说很多原因促成了泛型的出现,最引人注目的一个原因就是为了创造容器类。这个要怎么来理解呢?...我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是限定某种类型上来。...(之所以要强调在写代码时是因为泛型在虚拟机中会被JVM擦除掉它的具体类型信息,这点可参考泛型,在这里不做引申)。 比如在jdk中的List类是个泛型类。...这点给我们带来的启示是,在编写类似List类的时候,一定要注意是否用泛型。一定要多写几个泛型类,多讨论多理解,不然还是可能会搅在一起。 接着是?

2.1K100

java泛型中的通配符 T,E,K,V,?

java泛型 java泛型(generics)是jdk5引入的新特性,泛型提供了编译时类型安全检测机制,该机制运行开发者在编译时检测到非法的类型....泛型的本质是参数化类型,也就是说,将所操作的数据类型作为一个参数传递,通过这个类型参数,就能识别这个变量的类型 public class TestGenericT> { private T...testGeneric.setT("test"); //可以直接打印getT(),默认为String System.out.println(testGeneric.getT()); } } 泛型中的通配符...K和V 表示key,value,比如用于map的通配符 T(type) 表示具体的一个java类型 E (element) 表示一个元素,例如List 除了这几个特定意义的通配符之外,还存在 ?...无界通配符,这个东西一般会在方法参数上使用,搭配 T extends E> 和 T super E> 使用 上界通配符 T extends E> 该符号表示,在参数中,传入的类型必须是E或者继承与

68610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处: 如果传入的类型不是 E 或者 E 的子类,编译不成功 泛型中可以使用 E 的方法,要不然还得强转成...car = operate(); 简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。...> clazz; // 不会报错 public ClassT> clazzT; 小结 本文零碎整理了下 JAVA 泛型中的一些点,不是很全,仅供参考。

    1.1K30

    Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    >`和 `ClassT >`区别 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处: 如果传入的类型不是 E 或者 E 的子类,编译不成功 泛型中可以使用 E 的方法,要不然还得强转成...car = operate(); 简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。...> clazz; // 不会报错 public ClassT > clazzT; 小结 本文零碎整理了下 JAVA 泛型中的一些点,不是很全,仅供参考。如果文中有不当的地方,欢迎指正。

    2.2K51

    Java泛型中的通配符 T,E,K,V,?,你确定都了解吗?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...表示不确定的 java 类型 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值中的Key Value E (element) 代表Element ?...在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类,这样有两个好处: 如果传入的类型不是 E 或者 E 的子类,编译不成功 泛型中可以使用 E 的方法,要不然还得强转成...car = operate(); 简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。

    1.5K20

    三分钟学习Java泛型中T、E、K、V、?的含义

    大家好,又见面了,我是全栈君 泛型是Java中一个非常重要的内容,对于Java进阶学习是必须要掌握的知识点之所以说这个知识点重要,如果你有过阅读过一些开源框架的代码,那你一定会看到源码中有很多地方使用到了泛型...看了上面的源码,简单聊一下泛型,也就是回顾一下泛型的相关知识,来源百度百科。 【泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。...•E – Element (在集合中使用,因为集合中存放的是元素),E是对各方法中的泛型类型进行限制,以保证同一个对象调用不同的方法时,操作的类型必定是相同的。...---- ---- 泛型类定义 //紧跟类名后面 public class Test{} 泛型方法定义 //紧跟修饰符后面(public) public T Test1(T t){} ?

    75720

    深入分析Java反射(三)-泛型

    历史原始类型和新扩充的泛型类型都应该统一成各自的字节码文件类型对象,也就应该把泛型类型归并进去java.lang.Class中。...但是由于JDK已经迭代了很多版本,泛型并不属于当前Java中的基本成分,如果JVM中引入真正的泛型类型,那么必须涉及到JVM指令集和字节码文件的修改(这个修改肯定不是小的修改,因为JDK当时已经迭代了很多年...Type体系虽然看似很美好解决了泛型相关的类型和原始存在的java.lang.Class描述的类型的统一问题,但是引入了新的问题:如果一个方法返回值为java.lang.reflect.Type类型,或者一个方法的入参类型为...JDK中操作泛型的API 这里列举一下JDK中笔者所知的操作泛型的相关API(可以会有遗漏),这些API主要和反射操作相关: java.lang.Class中的相关方法: 方法 功能 Type[] getGenericInterfaces...() 返回类实例的接口的泛型类型 Type getGenericSuperclass() 返回类实例的父类的泛型类型 java.lang.reflect.Constructor中的相关方法: 方法 功能

    1.6K20

    Java 中文官方教程 2022 版(四十三)

    本课程向您展示了 Java™ 平台的安全架构如何处理扩展。您将了解到如何查看授予扩展软件的权限,并学会通过一些简单的步骤修改扩展权限。此外,您还将学习如何封装扩展中的包,以限制对代码指定部分的访问。...此外,此声明包含两个泛型类型参数,K和V。示例代码仅打印这些参数的名称,但可以使用java.lang.reflect.TypeVariable中的方法检索有关它们的其他信息。...如果该属性不可用,则退而求其次使用 Field.getType(),这个方法在引入泛型之后并没有改变。反射中其他以 getGeneric*Foo* 命名的方法,对于某个 Foo 值的实现方式类似。...如果属性不可用,则会回退到未更改的Method.getReturnType(),这是在引入泛型之前没有更改的。其他以反射中某个值Foo为名称的getGeneric*Foo*()方法实现方式类似。...它还显示方法是否是合成的(编译器生成的)、可变参数的,或者是桥接方法(编译器生成的以支持泛型接口)。

    19200

    泛型

    in authors } // 这个 泛型扩展函数 能任何种类元素的列表上调用 // val T> ListT>.penultimate: T //...--------*/ // 和Java一样,Kotlin的泛型在运行时也被擦除了。...// List的List是只读的,所以它只有一个返回类型为 T 的元素的方法 get,而没有定义任何类型为T的元素存储到列表中的方法,因为它是协变的。...会提示报错 // println(Validators[String::class].validate(42)) 总结 Kotlin 的泛型和 Java 相当接近:它们使用同样的方式声明泛型函数和泛型类...在Kotlin 中既可以为整个泛型类指定变型(声明点变型),也可以为泛型类型特定的使用指定变型(使用点变型)。 当确切的类型实参是未知的或者不重要的时候,可以使用星号投影语法。

    1.8K10

    根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)

    因为项目的需要,设计了一个满足特定需要的代码自动生成工具。在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的泛型方法。...void test(int a,URL b,T c){ } public T1,T2,T3>void test(T1 a,T2 b,T3 c){ } } 于是对java关于泛型方法匹配的方式做了研究...,发现java编译器在匹配泛型方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现泛型方法的精确匹配。...ArrayListjava.lang.reflect.Method>(); //查找同名且参数数目相同的所有方法 for (java.lang.reflect.Method...,可能会出现返回并不匹配方法的结果,不过在我的应用场景中有别的措施做了保证,所以不会有问题,你可以根据自己需要再补充一些检查代码。

    1.6K30

    【小家Java】你真的了解Java泛型参数吗?细说java.lang.reflect.Type(ParameterizedType、TypeVariable、WildcardType...)

    与泛型有关的类型不能和原始类型统一到Class的原因 产生泛型擦除的原因 原始类型和新产生的类型都应该统一成各自的字节码文件类型对象。但是由于泛型不是最初Java中的成分。...所以和泛型相关的新扩充进来的类型不能被统一到Class类中。...与泛型有关的类型在Java中的表示 为了通过反射操作这些类型以迎合实际开发的需要,Java就新增了ParameterizedType, TypeVariable, GenericArrayType...统一了与泛型有关的类型和原始类型Class Type接口中没有方法的原因 从上面看到,Type的出现仅仅起到了通过多态来达到程序扩展性提高的作用,没有其他的作用。...因此Type接口的源码中没有任何方法。 最后用一个我们最常用的例子:反射获取泛型类型。

    3.2K10

    反射 — Java 高级开发必须懂的

    方法如果没有返回值,返回null,如果有返回值返回Object类型,然后再强制类型转换为原函数的返回值类型 六、通过反射了解集合泛型的本质 ArrayList list1 =newArrayList()...结果分析:因为反射的操作都是编译之后的操作,也就是运行时的操作,c1==c2返回true,说明编译之后集合的泛型是去泛型化的。...那么我们就可以理解为,Java集合中的泛型,是用于防止错误类型元素输入的,比如在list2中我们add一个int,add(10)就会编译报错,那么这个泛型就可以只在编译阶段有效,通过了编译阶段,泛型就不存在了...使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类的时候 直接使用java.exe命令来运行某个主类 3、类加载器 负责将.class文件加载到内存中,并为之生成对应的...,负责Java核心类的加载,比如System类,在JDK中JRE的lib目录下rt.jar文件中的类 Extension ClassLoader 扩展类加载器 负责JRE的扩展目录中jar

    38530

    Java反射-高级开发必须懂的

    new出来,因为java.lang.Class类的构造方法是私有的。...m.invoke(对象,参数列表) 方法如果没有返回值,返回null,如果有返回值返回Object类型,然后再强制类型转换为原函数的返回值类型 六:通过反射了解集合泛型的本质 ArrayList...结果分析:因为反射的操作都是编译之后的操作,也就是运行时的操作,c1==c2返回true,说明编译之后集合的泛型是去泛型化的。...那么我们就可以理解为,Java集合中的泛型,是用于防止错误类型元素输入的,比如在list2中我们add一个int,add(10)就会编译报错,那么这个泛型就可以只在编译阶段有效,通过了编译阶段,泛型就不存在了...②Extension ClassLoader 扩展类加载器 负责JRE的扩展目录中jar包的加载,在JDK中JRE的lib目录下ext目录。

    50330

    Java5新特性及使用

    新特性列表 一、泛型(Generics) 1. 概述 Java语言引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。...泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法中,分别称为泛型类、泛型接口、泛型方法。 2....要定义泛型方法,只需将泛型参数列表置于返回值之前,就像下面这样: public class GenericMethods { //当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上...Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。...也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。 要想在表达式中使用类型,需要显式地传递类型的class对象。

    1.3K30

    Java泛型类型擦除问题

    Java泛型类型擦除问题 以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此Listjava泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。...string spec 反序列化成相应的类型,比较理想的方式是在反序列化的方法中能够获取到参数类型 T 的实际类型,理论上运行时Spec类型是确定了,因此T也应该是确定的,但是因为类型擦除,所以实际上获取不到他的类型...第二种是创建spec的子类中使用这个方法就可以获取泛型的类型 @Data public abstract static class AbstractSpecT> { public String...因此理论上子类Spec的类型信息中,实际上是保存了父类中的类型参数信息的,也就是例子中的Foo.

    1.1K20

    Java进阶 | 泛型机制与反射原理

    一、泛型的概念 1、基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public static void main...,显然没有指定明确的类型,只是起到类型传递的作用,即K是key的类型,V是value的类型,在上面的源码中描述的很清楚,结合上面案例,在Map对象声明的时候可以明确指定的类型,也可以缺省为...2、泛型描述 泛型即可以理解为把数据类型作为参数,即参数化类型,用来提高代码的安全性,灵活性,避免类型转换;代码简洁明了,同时对于程序的可扩展性起到至关重要的作用。...Fire",119L) ; return map.size()>0 ; } } ; } } 通过上面这个案例,可以清楚的感觉到泛型机制的灵活和强大...{ private T param ; public DefEntry (T param){ this.param = param ; } } 编译过程中,会对泛型合法性作校验

    63220
    领券