本着息事宁人的态度,类型不匹配我强转下不就得啦: it.get(this@description as out Person) // 错误的!!...当然是从获取反射引用的 KClass 对象来的,也就是 this::class 这个对象了,这个对象难道不应该是 KClass 吗?No,是 KClass!...可这不对呀,person::class 不应该拿到的是对象真实的类型吗?...> getClass() 但这个返回值实际上是协变的: ClassKClass 实例的方法其实不止 person::class 这样一种,还有一种叫做:this.javaClass.kotlin ,这货的类型是 KClass
val obj = MyClass() val clazz = obj.javaClass 调用的类是 Kotlin 类 val clazz = MyClass::class 此时 clazz 的类型是...KClass 类型,KClass 的一个实例表示对 Kotlin 类的引用。...Kotlin 的引用类有两种方式:类名::class和对象::class,它们获取的都是相同的 KClass 实例。 即处于同一个类加载器中,给定的类型只能返回一个 KClass 实例。...call()方法使用指定的参数列表,开发者需要自行匹配所使用的实参类型和数量,如果其类型与参数的类型不匹配,则会引发异常。...public val T : Any> ClassT>.kotlin: KClassT> @JvmName("getKotlinClass") get() = Reflection.getOrCreateKotlinClass
、类型变量-TypeVariable、基本类型-Class)的共同接口;前两篇反射和注解讲到的ClassT>就是Type的一实现类 ?...称为通配符类型WildcardType GenericArrayType 表示一种元素类型是ParameterizedType(参数化类型)或者TypeVariable(类型变量)的数组类型,如T[]...4 类型擦除 创建泛型的实例时,jvm是会把具体类型擦除的;编译生成的字节码中不包含泛型中的类型参数,即ArrayList和ArrayList都擦除成了ArrayList...无界通配符可以匹配任意类型;但是在使用?时,不能给泛型类的变量设置值,因为我们不知道具体类型是什么;如果强行设置新值,后面的读容易出现ClassCastException错误。...TypeVariable类型数组,即形如:TestT>[][]、T[]等,是GenericArrayType的子接口 public class MainTestT> { T[] param;
虽然两种方法都能用,但大多数方法主要靠其中一种。 注解是把编程中的元数据信息直接写在源代码中,而不是保存在外部文件中。...我们这里给出的示例是用在类上 @Run class SwordTest {} 我们声明的 TestCase 注解,它有个构造函数,传入的参数是一个String类型的id。...使用 ::class 来获取sword对象实例的 KClass 类的引用 val kClass = sword::class 上面的这行代码,Kotlin编译器会自动推断出kClass变量的类型是 val...).getClass() as ClassT> 或者使用KClass实例的 .java 属性 val jkCLass = kClass.java 这个KClassT>.java 的扩展属性的实现源码如下...对象引用 val kClass = container::class // 获取KClass对象 KClass对象的 typeParameters 属性中存有类型参数的信息 val typeParameters
,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象。...在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就叫做类型擦除。...来表示位置类型,比如List就声明了List中包含的元素类型是未知的。通配符所代表的其实是一组类型,但具体的类型是未知的。List 所声明的就是所有类型都是可以的。但是ListClassT>> :ClassT>类上声明的TypeVariable TypeVariable : Method类上声明的TypeVariable TypeVariableT>> : Constructor类上声明的TypeVariable 所以TypeVariable中的泛型是对定义TypeVariable位置的描述,不同的GenericDeclaration
(从左到右)依次是:GenericArrayType(数组类型)、ParameterizedType(参数化类型)、WildcardType( 泛型表达式类型)、TypeVariable(类型变量)、Class...~ GenericArrayType(数组类型) 泛型数组,描述的是形如:AT>[]或T[]类型变量和原始类型 public interface GenericArrayType extends Type...( 泛型表达式类型) 通配符表达式,或泛型表达式,它虽然是Type的一个子接口,但并不是Java类型中的一种,表示的仅仅是类似 ?...,指的是ListT>、Map中的T,K,V等值,实际的Java类型是TypeVariableImpl(TypeVariable的子类;此外,还可以对类型变量加上extend限定,这样会有类型变量对应的上限...(Class也是种类的意思,Type是类型的意思) 是为了程序的扩展性,最终引入了Type接口作为Class,ParameterizedType,GenericArrayType,TypeVariable
基于这种情况,Java对其进行了抽象,得到了一个新的类型TypeVariable。 TypeVariable 简介 类型变量,或者也可以叫泛型变量。具体就是指我们在申明泛型时定义的T,K,U这种变量。...T,K,U这一类的名称 getAnnotatedBounds(),此方法返回一个AnnotatedType类型的数组,获取的是我们在类型变量的上界。...class java.lang.Object GenericArrayType 简介 GenericArrayType是Type的子接口,用于表示“泛型数组”,描述的是形如:A[]或T[]的类型。...是一个泛型数组 数组的元素类型为:T t2是一个泛型数组 数组的元素类型为:T[] list不是一个泛型数组 stringListArray是一个泛型数组 数组的元素类型为:java.util.List...另外,在上面的例子中,大家可以思考以下几个问题: t1是一个泛型数组,数组的元素类型为:T,那么T是一个什么类型呢? t2是一个泛型数组,数组的元素类型为:T[],那么T[]又是什么类型?
,只返回自己内部定义的字段,不包含其父类中的,这点需要注意,和getFields是有区别的。...TypeVariable接口 这个接口表示的是泛型变量,例如:ListT>中的T就是类型变量;而class C1T1,T2,T3>{}表示一个类,这个类中定义了3个泛型变量类型,分别是T1、T2和...GenericArrayType接口 表示的是数组类型,且数组中的元素是ParameterizedType或者TypeVariable。 例如:List[]或者T[]。...//@0 public class C1 {//@1 /** * m1方法参数和返回值都是泛型类型,泛型的实际类型是泛型变量类型T,T是在Demo4中声明的...声明了一个泛型类型的变量T;T是个泛型类型的变量,泛型类型的变量在java中使用TypeVariable来表示。
因为Number的精度是16位,而雪花ID是19位 找了网上很多Java下配自定义序列化器的,改成Kotlin语法,如下 @Configuration class JacksonConfig {...: Any> KClass<T>.javaPrimitiveType: Class<T>?...返回一个 JavaClass实例,表示对应于给定KClass的基本类型(如果存在)。...val <T : Any> KClass<T>.javaObjectType: Class<T> 返回对应于给定KClass实例的 Java Class实例。...在原始类型的情况下,它返回相应的包装类。
该引用是 KClass 类型的值 请注意,Kotlin 类引用与 Java 类引用不同。...平时写的类,其信息都可以在这个KClass来获取 属性引用 data class MediaItem(val title: String, val url: String) var items= mutableListOf...} //另外,如果这个 Lambda 是单参数的,它的这个参数也省略掉不写: //根据上下文推导,根据最后一行代码来推断出返回值类型 view.setOnClickListener {...: result }) // lambda 表达式的参数类型是可选的,如果能够推断出来的话: val joinedToString = items.fold("Elements:", { acc...let 允许我们自定义参数名字,使可读性更强,如果倾向可读性可以选择 T.let 参考文章 Kotlin 的高阶函数、匿名函数和 Lambda 表达式 Kotlin官网
不能用来匹配。 但是使用 getFirst就不存在这个问题,因为我们无需care它获取到的类型是什么,但一定是 Fruit的子类。...> p) { swapHelper(p);} 在这种情况下, swapHelper方法的参数 T捕获通配符,它不知道是哪种类型的通配符,但是,这是一个明确的类型,并且 T>swapHelper的定义只有在...通配符捕获只有在有许多限制的情况下才是合法的。编译器必须能够确信通配符表达的是单个,确定的类型。例如, ArrayListT>>中的 T永远不能捕获 ArrayList类型声明,使用 java.lang.reflect包中提供的接口 Type,这个接口包含下列子类型: Class类,描述具体类型 TypeVariable接口,描述类型变量(如 TextendsComparable...> t = (TypeVariable<?
泛型参数的例子 其实问题是很清楚的,this::class 表示的是对象的类型,而 T::class 则取决于 T 被如何推断。具体用哪个,取决于你的需求。...我们再给大家看个例子: abstract class AT>{ val t: T = ... } A 有个属性是 T 类型的,而这个属性呢,需要在内部初始化。...我们在定协议时要求类型 T 有默认构造方法,以便于我们通过反射实例化它。 我们知道 Kotlin 的泛型也是伪泛型,T 在这里不能直接用于获取其具体的类型,如果我们想要初始化 t,该怎么做呢?...call() as T } } 首先我们拿到 this@A::class,这实际上并不是 A::class,这一点一定要注意,我们这段代码实际上是运行在子类实例化的过程中的,this 是一个子类类型的引用...也正是因为这一点,我们想要获取泛型参数 T 的实参,还需要先拿到 super type 也就是 A 的 KType 实例了。 其次,获取泛型实参,并拿到实参类型的 KClass 实例。
)、类型变量(TypeVariable)、基本类型(Class) 进一步说明; 1.ParameterizedType ParameterizedType表示参数化类型,也就是泛型,例如ListT>、...(Map)返回; 我们经常遇到的ListT>,通过getActualTypeArguments()方法,得到的返回值是TypeVariableImpl对象,也就是TypeVariable...值得注意的是,无论是几维数组,getGenericComponentType()方法都只会脱去最右边的[],返回剩下的值; 3.TypeVariable 泛型的类型变量,指的是ListT>、Map中的T,K,V等值,实际的Java类型是TypeVariableImpl(TypeVariable的子类);此外,还可以对类型变量加上extend限定,这样会有类型变量对应的上限; ?...Class 通过上面的例子,可以看出,当我们没有声明泛型的时候,我们普通的对象就是一个Class类型,是Type中的一种; 5.WildcardType ?
: 下面的代码中 , 通过 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 语言中 , 需要通过
public,不写默认为public 该元素的类型只能是基本数据类型、String、Class、枚举类型、注解类型(体现了注解的嵌套效果)以及上述类型的一位数组 该元素的名称一般定义为名词,...UseAnnotation7T0是在类上声明的一个泛型类型变量") T0, @Ann7("T1是在类上声明的一个泛型类型变量") T1> { public 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
是吧,所以如果我们要实现一个非常聪明的智能是很难的。 不过若干智能助手也是有名的蠢了。 所以,我实现一个蠢但没完全蠢的智能回复应该问题不大。...区分词的类型,如:名词、动词、形容词...等等,然后通过权重将这些词关联起来,最后总结出一个最匹配的回答。 不过实现起来感觉很复杂就放弃了。 ?...image.png 后面就想着,我可以简化这个过程啊,不去区分词的类型,直接就是在所有定义好的句子中取到最匹配的那条。...class Sentence{ // ... // 获取用户发送的语句与定义的句子的匹配程度 match(arr){ // 每次匹配都重置数据 this.typeVariable...class Sentence{ // ... // 获取用户发送的语句与定义的句子的匹配程度 match(arr){ this.typeVariable = {}; let
(ParameterizedType)、数组类型(GenericArrayType)、类型变量(TypeVariable)、基本类型(Class); 原始类型,不仅仅包含我们平常所指的类,还包括枚举、数组...、注解等; 参数化类型,就是我们平常所用到的泛型List、Map; 数组类型,并不是我们工作中所使用的数组String[] 、byte[],而是带有泛型的数组,即T[] ; 基本类型,也就是我们所说的java...ParameterizedType源码 2.TypeVariable 类型变量,即泛型中的变量;例如:T、K、V等变量,可以表示任何类;在这需要强调的是,TypeVariable代表着泛型中的变量,而ParameterizedType...TypeVariable源码 3.GenericArrayType 泛型数组类型,用来描述ParameterizedType、TypeVariable类型的数组;即ListT>[] 、T[]等; ?...GenericArrayType源码 4.Class 上三者不同,Class是Type的一个实现类,属于原始类型,是Java反射的基础,对Java类的抽象; 在程序运行期间,每一个类都对应一个Class
,参数化类型,形如:ObjectT, K>,即常说的泛型,是Type的子接口。...ListT> a3;//返回的是T,TypeVariable类型 4. List a4; //返回的是WildcardType类型 5....类型,但直接输出的不是具体Type的五种子类型,而是这五种子类型以及WildcardType具体表现形式 System.out.println(type.getClass().getName...} //注意类型(Type)与类(Class)的区别 3、2 Type类 Type是java类型信息体系中的顶级接口,其中Class就是Type的一个直接实现类。...super T>, interface java.io.Serializable],它们的类型却是不一样的,第1个是ParameterizedType,而第二个是Class 3、2、3 ParameterizedType
,它和ParameterizedType不同的地方是,ParameterizedType表示的参数的最外层一定是已知具体类型的(如List),而TypeVariable面向的是K、V、E...常见的TypeVariable的表示形式是T extends KnownType-1 & KnownType-2>。...它要求元素的类型是ParameterizedType或TypeVariable(实际中发现元素是GenericArrayType也是允许的)。...; //是GenericArrayType,元素是T类型,也就是TypeVariable类型 Person[] persons; //不是GenericArrayType List strings...T[] ts:s数组是GenericArrayType类型,调用getGenericComponentType后返回的类型是T,也就是数组元素是TypeVariable类型。
// 现在 ArrayList 的泛型类型形参 T 就是List的类型实参 class ArrayListT> : List2T> { override fun...cleanLitter() // 错误:推导的类型是 Herd,但期望的却是 Herd。...// List的List是只读的,所以它只有一个返回类型为 T 的元素的方法 get,而没有定义任何类型为T的元素存储到列表中的方法,因为它是协变的。...} } /* * 星号投影的语法很简洁,但只能用在对泛型类型实参的确切值不感兴趣的地方: * 只是使用生产值的地方,而且不关心那些值的类型...(kClass: KClassT>): FieldValidatorT> = // validators[kClass] as?
领取专属 10元无门槛券
手把手带您无忧上云