首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

基础篇:深入解析JAVA泛型

类型变量-TypeVariable、基本类型-Class共同接口;前两篇反射和注解讲到Class就是Type一实现类 ?...称为通配符类型WildcardType GenericArrayType 表示一种元素类型ParameterizedType(参数化类型)或者TypeVariable类型变量)数组类型,如T[]...4 类型擦除 创建泛型实例时,jvm会把具体类型擦除;编译生成字节码中包含泛型中类型参数,即ArrayList和ArrayList都擦除成了ArrayList...无界通配符可以匹配任意类型;但是在使用?时,不能给泛型类变量设置值,因为我们不知道具体类型是什么;如果强行设置新值,后面的读容易出现ClassCastException错误。...TypeVariable类型数组,即形如:Test[][]、T[]等,GenericArrayType子接口 public class MainTest { T[] param;

1.3K20

第12章 元编程与注解、反射第12章 元编程与注解、反射

虽然两种方法都能用,大多数方法主要靠其中一种。 注解把编程中元数据信息直接写在源代码中,而不是保存在外部文件中。...我们这里给出示例用在类上 @Run class SwordTest {} 我们声明 TestCase 注解,它有个构造函数,传入参数一个String类型id。...使用 ::class 来获取sword对象实例 KClass引用 val kClass = sword::class 上面的这行代码,Kotlin编译器会自动推断kClass变量类型 val...).getClass() as Class 或者使用KClass实例 .java 属性 val jkCLass = kClass.java 这个KClass.java 扩展属性实现源码如下...对象引用 val kClass = container::class // 获取KClass对象 KClass对象 typeParameters 属性中存有类型参数信息 val typeParameters

97720

细说java.lang.reflect.Type(ParameterizedType、TypeVariable、WildcardType...)

(从左到右)依次:GenericArrayType(数组类型)、ParameterizedType(参数化类型)、WildcardType( 泛型表达式类型)、TypeVariable类型变量)、Class...~ GenericArrayType(数组类型) 泛型数组,描述形如:A[]或T[]类型变量和原始类型 public interface GenericArrayType extends Type...( 泛型表达式类型) 通配符表达式,或泛型表达式,它虽然Type一个子接口,并不是Java类型一种,表示仅仅是类似 ?...,指的是List、Map中T,K,V等值,实际Java类型TypeVariableImpl(TypeVariable子类;此外,还可以对类型变量加上extend限定,这样会有类型变量对应上限...(Class也是种类意思,Type类型意思) 是为了程序扩展性,最终引入了Type接口作为Class,ParameterizedType,GenericArrayType,TypeVariable

3K10

泛型,有点难度,会让很多人懵逼,那是因为你没有看这篇文章!

,只返回自己内部定义字段,包含其父类中,这点需要注意,和getFields有区别的。...TypeVariable接口 这个接口表示泛型变量,例如:List中T就是类型变量;而class C1{}表示一个类,这个类中定义了3个泛型变量类型,分别是T1、T2和...GenericArrayType接口 表示数组类型,且数组中元素ParameterizedType或者TypeVariable。 例如:List[]或者T[]。...//@0 public class C1 {//@1 /** * m1方法参数和返回值都是泛型类型,泛型实际类型泛型变量类型TT在Demo4中声明...声明了一个泛型类型变量TT个泛型类型变量,泛型类型变量在java中使用TypeVariable来表示。

89720

从javaType到SpringResolvableType

基于这种情况,Java对其进行了抽象,得到了一个新类型TypeVariableTypeVariable 简介 类型变量,或者也可以叫泛型变量。具体就是指我们在申明泛型时定义T,K,U这种变量。...T,K,U这一类名称 getAnnotatedBounds(),此方法返回一个AnnotatedType类型数组,获取我们在类型变量上界。...class java.lang.Object GenericArrayType 简介 GenericArrayTypeType子接口,用于表示“泛型数组”,描述形如:A[]或T[]类型。...一个泛型数组 数组元素类型为:T t2一个泛型数组 数组元素类型为:T[] list不是一个泛型数组 stringListArray一个泛型数组 数组元素类型为:java.util.List...另外,在上面的例子中,大家可以思考以下几个问题: t1一个泛型数组,数组元素类型为:T,那么T一个什么类型呢? t2一个泛型数组,数组元素类型为:T[],那么T[]又是什么类型

2K40

T::class 和 this::class 区别

泛型参数例子 其实问题很清楚,this::class 表示对象类型,而 T::class 则取决于 T 被如何推断。具体用哪个,取决于你需求。...我们再给大家看个例子: abstract class A{ val t: T = ... } A 有个属性 T 类型,而这个属性呢,需要在内部初始化。...我们在定协议时要求类型 T 有默认构造方法,以便于我们通过反射实例化它。 我们知道 Kotlin 泛型也是伪泛型,T 在这里不能直接用于获取其具体类型,如果我们想要初始化 t,该怎么做呢?...call() as T } } 首先我们拿到 this@A::class,这实际上并不是 A::class,这一点一定要注意,我们这段代码实际上运行在子类实例化过程中,this 一个子类类型引用...也正是因为这一点,我们想要获取泛型参数 T 实参,还需要先拿到 super type 也就是 A KType 实例了。 其次,获取泛型实参,并拿到实参类型 KClass 实例。

1.2K30

Kotlin中反射机制深入讲解

获取Class对象 Java面向对象语言,同样.class字节码文件也例外,想要获取.class文件中内容,就要先获取.class文件对应Class对象。...Kotlin中可以使用Java中反射,但是由于Kotlin中字节码.class对应KClass类,所以如果想要使用Java中反射,需要首先获取Class实例,在Kotlin中可以通过以下两种方式来获取...//1.通过类::class方式获取Kclass实例 val clazz1: KClass<* = HelloWorld::class //2.通过实例.javaClass.kotlin获取Kclass...: Collection<KFunction<* //返回类扩展属性 val <T : Any KClass<T .declaredMemberExtensionProperties: Collection...//返回类自身声明成员变量(属性) val <T : Any KClass<T .declaredMemberProperties: Collection<KProperty1<T, * 类相关信息

1.7K20

Java基础系列(三十七):泛型继承,通配符,泛型反射

不能用来匹配。 但是使用 getFirst就不存在这个问题,因为我们无需care它获取到类型是什么,一定是 Fruit子类。...> p) { swapHelper(p);} 在这种情况下, swapHelper方法参数 T捕获通配符,它不知道哪种类型通配符,但是,这是一个明确类型,并且 swapHelper定义只有在...通配符捕获只有在有许多限制情况下才是合法。编译器必须能够确信通配符表达单个,确定类型。例如, ArrayList>中 T永远不能捕获 ArrayList<Pair<?...为了表达泛型类型声明,使用 java.lang.reflect包中提供接口 Type,这个接口包含下列子类型Class类,描述具体类型 TypeVariable接口,描述类型变量(如 TextendsComparable...> t = (TypeVariable<?

60430

【Kotlin】:: 双冒号操作符详解 ( 获取类引用 | 获取对象类型引用 | 获取函数引用 | 获取属性引用 | Java 中 Class 与 Kotlin 中 KClass )

: 下面的代码中 , 通过 Student::class 获取 引用对象类型 KClass ; import kotlin.reflect.KClass class Student...属性可以获取类完整名称 ; kotlin.reflect.KClass Kotlin 语言中字节码类 , java.lang.Class Java 语言字节码类 ; 下面 KClass...* * @param T类型。...与 kotlin.reflect.KClass ---- KClass Kotlin 类 引用类型 , Kotlin 类实例对象 , 通过 类名::class 可以获取 KClass 引用..., Class 全类名 java.lang.Class ; 与 KClass 相对 Java 中 Class 类 , Java 中 引用类型 ; 在 Java 语言中 , 需要通过

4.4K10

Spring系列第十七讲 深入理解Java注解及Spring对注解增强(上)

public,写默认为public 该元素类型只能基本数据类型、String、Class、枚举类型、注解类型(体现了注解嵌套效果)以及上述类型一位数组 该元素名称一般定义为名词,...UseAnnotation7 { public <@Ann7("T2...上面有3个泛型类型变量,我们运行一下看看效果: 类型变量名称:T0 @com.javacode2018.lesson001.demo18.Ann7(value=T0在类上声明一个泛型类型变量) 类型变量名称...:T1 @com.javacode2018.lesson001.demo18.Ann7(value=T1在类上声明一个泛型类型变量) 类型变量名称:T2 @com.javacode2018.lesson001....demo18.Ann7(value=T2在方法上声明泛型类型变量) @Target(ElementType.TYPE_USE) 这个1.8加上,能用在任何类型名称上,来个案例感受一下: @Target

1.1K21

我眼中Java-Type体系(1)1.ParameterizedType2.TypeVariable3.GenericArrayType4.Class5.WildcardType

(ParameterizedType)、数组类型(GenericArrayType)、类型变量(TypeVariable)、基本类型(Class); 原始类型,不仅仅包含我们平常所指类,还包括枚举、数组...、注解等; 参数化类型,就是我们平常所用到泛型List、Map; 数组类型,并不是我们工作中所使用数组String[] 、byte[],而是带有泛型数组,即T[] ; 基本类型,也就是我们所说java...ParameterizedType源码 2.TypeVariable 类型变量,即泛型中变量;例如:T、K、V等变量,可以表示任何类;在这需要强调TypeVariable代表着泛型中变量,而ParameterizedType...TypeVariable源码 3.GenericArrayType 泛型数组类型,用来描述ParameterizedType、TypeVariable类型数组;即List[] 、T[]等; ?...GenericArrayType源码 4.Class 上三者不同,ClassType一个实现类,属于原始类型Java反射基础,对Java类抽象; 在程序运行期间,每一个类都对应一个Class

1.1K60

我眼中Java-Type体系(2)1.ParameterizedType2.GenericArrayType3.TypeVariable4.Class5.WildcardType

)、类型变量(TypeVariable)、基本类型(Class) 进一步说明; 1.ParameterizedType ParameterizedType表示参数化类型,也就是泛型,例如List、...(Map)返回; 我们经常遇到List,通过getActualTypeArguments()方法,得到返回值TypeVariableImpl对象,也就是TypeVariable...值得注意,无论几维数组,getGenericComponentType()方法都只会脱去最右边[],返回剩下值; 3.TypeVariable 泛型类型变量,指的是List、Map中T,K,V等值,实际Java类型TypeVariableImpl(TypeVariable子类);此外,还可以对类型变量加上extend限定,这样会有类型变量对应上限; ?...Class 通过上面的例子,可以看出,当我们没有声明泛型时候,我们普通对象就是一个Class类型Type中一种; 5.WildcardType ?

98870

前端手写一个人工智能回复小助手

吧,所以如果我们要实现一个非常聪明智能很难。 不过若干智能助手也是有名蠢了。 所以,我实现一个蠢没完全蠢智能回复应该问题不大。...区分词类型,如:名词、动词、形容词...等等,然后通过权重将这些词关联起来,最后总结出一个最匹配回答。 不过实现起来感觉很复杂就放弃了。 ?...image.png 后面就想着,我可以简化这个过程啊,不去区分词类型,直接就是在所有定义好句子中取到最匹配那条。...class Sentence{ // ... // 获取用户发送语句与定义句子匹配程度 match(arr){ // 每次匹配都重置数据 this.typeVariable...class Sentence{ // ... // 获取用户发送语句与定义句子匹配程度 match(arr){ this.typeVariable = {}; let

47320
领券