如何制作通用类型转换函数以将上下文转换为任何活动?

安卓开发

我想创建一个通用函数,允许将上下文转换为传入参数的活动类型。

这个想法的例子:

private fun <T> castContext(activityType: T): T{
  //example activityType = MainActivity
  return context as T
}
只是通过

为此,您需要提供类型信息,通常仅在编译时可用(由于类型擦除)。在Java中,你会提供的实例Class或叫什么type token

1 如果类型信息在编译时可用,则可以使用

private inline fun <reified T: Any> castContext(activity: Any?): T {
  return activity as T
}

内联函数是仅编译时构造,因此可以代替您将类型信息“嵌入”到字节码中(如将其作为函数参数显式传递)——这是通过对泛型类型参数进行具体化来完成的。

您可以将通用参数范围进一步缩小Any到您希望针对您的需要专门化此功能的任何内容。

2 如果你想动态地转换到某个类的实例,在编译时未知,你需要做一个正常的转换:

val type: KClass<*> = ...
type.cast(instance)
type.safeCast(instance)

因为 Kotlin 的asas?关键字不是方法(这让()我很恼火,因为经常需要额外的转换,我正在使用这对函数:


/** @return this as instance of the specified type (equivalent to this as T) */
inline fun <reified T: Any> Any?.asIs(): T = this as T

/** @return this as instance of the specified type (equivalent to this as? T) */
inline fun <reified T: Any> Any?.asIf(): T? = this as? T

使用Any?as 方法接收器有些争议,因为隐式处理 null,而不是在调用站点上显式处理,使用?.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何修复不兼容的类型:片段无法转换为上下文

将EBNF语法转换为无上下文语法

错误:类型不兼容:NewSubscription无法转换为上下文

如何将片段的上下文转换为LifecycleOwner?

错误:类型不兼容:HomeFragment无法转换为上下文

片段无法转换为上下文

错误:(124,62)错误:类型不兼容:无法将类转换为上下文

我们如何将上下文转换为片段引用?

将上下文差异转换为统一差异格式

无法将上下文转换为活动Xamarin

List <Trail>无法转换为上下文

如何将Django查询集转换为字典以用作模板上下文

为什么在通用上下文中不能将继承的接口转换为其基本接口?

如何在StatelessWidget的任何函数中获取上下文?

JS:如何将上下文传递给访问函数类的setTimeOut匿名函数

如何获取调用静态函数的活动的上下文?

CGSize类型的值在上下文中不能转换为bool

如何将此函数转换为通用类型?

如何通过Windows上下文菜单启动Perl脚本,将文件转换为变量

如何在推断的上下文中将std :: bind(或lambda)转换为std :: function?

将活动上下文转换为接口抛出 ClassCastException

无法将上下文转换为 Fragment 的 FragmentAdapter 中的 CustomCallBack 接口

上下文无法转换为 RecognitionListener

无法转换为上下文

上下文无法转换为 Tab1Values

如何在片段中使用 ContextCompat?它说片段无法转换为上下文

键路径值类型“Data.Element.ID”无法转换为上下文类型“ID”

使用 setTimeout 将上下文转换为 redux

Swift:帮助解决'Key path value type '_'无法转换为上下文类型'_''