栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Kotlin使用Class调用Java方法 论据

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kotlin使用Class调用Java方法 论据

@edwin的答案是正确的,您遇到了XY问题,您实际上是在问错了什么。值得庆幸的是,您在执行此操作时遇到了一个错误,这导致您进入此处,@
edwin能够解释执行正确行为的替代方法。

每个Java绑定库都具有类似的模式(

Class
与类型引用相对)。因此,这是好东西,您可以在您的库中学习和查找,例如RestTemplate,Jackson,GSON等。实用程序类可能
ParameterizedTypeReference
在一个中,
TypeReference
在另一个中,
TypeRef
在另一个中,依此类推;但所有人都在做同一件事。

现在,对于任何想知道原始代码有什么问题的人 ,创建一个泛型擦除的类引用(例如

Class<T>
语法)将是:

val ref = List::class.java

您会注意到没有办法表达列表中项目的通用类型。即使可以,它们也会由于类型擦除而被擦除。将此传递给绑定库就像说“
请为可能为空的java.lang.Object的列表 ”,但更糟。想象一下

Map<String,List<Int>>
,您现在在哪里丢失了所有可能反序列化的信息。

以下内容 无法 编译:

val ref = List<String>::class.java  // <--- error only classes are allowed on left side

错误消息可能更清楚地说:“ ::左侧仅允许没有通用参数的类

并且您

javaClass
只能在实例上使用,因此,如果您碰巧拥有一个方便的列表…

val ref = listOf("one", "two", "three").javaClass

然后,您将得到一个擦除的类型

Class<T>
,这再次是在这里使用错误的东西,但语法正确。

那么@edwin显示的代码实际上是做什么的呢?

通过创建具有超类型

ParameterizedTypeReference
的对象,代码可以解决此问题,因为即使删除了类型,任何类都可以通过的镜头看到其超类和接口中的泛型
Type
。例如:

val xyz = object : MySuperClass<SomeGenerics>() {}

匿名类的该实例具有

MySuperClass
具有通用参数的超类
SomeGenerics
。因此,如果
MySuperClass
包含以下代码:

abstract class MySuperClass<T> protected constructor() {    val type: Type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]}

然后,您可以添加

.type
到声明的末尾以访问此功能:

val typeOfSomeGenerics = object : MySuperClass<SomeGenerics>() {}.type

现在,您将具有一些

Type
描述我们的
SomeGenerics
类的实现。这将是一个:
Class
ParameterizedType
GenericArrayType
TypeVariable
,和
WildcardType

通过了解和使用这些知识,一个进行数据绑定的库足以了解其工作。

Kotlin的生活更轻松:

在Kotlin中,编写扩展函数很容易,因此您不必重复执行此类代码。只需创建一个使用内联泛型的助手内联函数来传递类型并创建

ParameterizedTypeReference

inline fun <reified T: Any> typeRef(): ParameterizedTypeReference<T> = object: ParameterizedTypeReference<T>(){}

现在,您可以将@edwin的示例更改为:

val response = restTemplate.exchange(request, typeRef<List<String>>())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393606.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号