Kotlin 具体化类型参数不支持智能转换

2024-01-07

我正在尝试设置未初始化的值,并试图让以下内容发挥作用。这主要是对具体化泛型的力量(和局限性)的好奇。

我试图为数据类的可选参数提供默认值。

inline fun <reified T> uninitialized(): T = when (T::class) {
  Long::class -> -1L // Type mismatch. Required: T  Found: Long
  String::class -> "" // Type mismatch. Required: T  Found: String
  // and so on...
  else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}

data class Thing(
    var id: Long = uninitialized(),
    var name: String = uninitialized() // and so on...
)

When when包括is Type子句,Kotlin 有智能铸造。在此示例中,智能转换未启动,因此无法编译。

有什么想法可以完成类似的事情吗?


使用后,智能转换将应用于特定对象is检查其类型或将其与null。在您的示例中,没有要检查类型的特定对象,也没有要应用智能转换的对象。

但是,您可以应用手动转换T,它将按预期工作。这是示例函数的工作版本,已更新以处理 Kotlin 反射库的特殊性,该特殊性将在 1.1 中修复:

inline fun <reified T : Any> uninitialized(): T = when (T::class.java) {
  Long::class.javaPrimitiveType, Long::class.javaObjectType -> -1L as T      
  String::class.java -> "" as T
  // and so on...
  else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}

data class Thing(
    var id: Long = uninitialized(),
    var name: String = uninitialized() // and so on...
)

fun main(args: Array<String>) {
    val t = Thing()
    println(t.id)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin 具体化类型参数不支持智能转换 的相关文章

随机推荐

  • ASP.NET 用户控件和 jQuery 对话框

    在我的页面上 我得到了以下用户控件 div class editFormDialog style display none font size 12px div
  • searchkick 索引相关模型字段

    我有一个 Rails 应用程序 我正在从 Sphinx 切换到 ElasticSearch 并使用 gem searchkick 我有一个模型教师和一个模型标签 通过 gem 其中教师可以关联多个标签 在教师模型中 我定义了这样的索引 de
  • Razor MVC 3 RC2 - 带有动态文本的 WebGrid Actionlink

    我正在 WebGrid 中输出带有动态链接文本的 Actionlink 我可以让它工作的唯一方法如下 Grid Column header Subject columnName Message Subject format item gt
  • 在 T O 重写函数中,如何取回它?

    我在 R 会话中做了一些愚蠢的事情 我写 打印 假 现在我无法打印东西 打印 1 错误 我该如何取回它 rm不会删除基础对象 因此您只需运行 rm print 有趣的是 你can打印东西 gt print lt FALSE gt print
  • 根据到期时间获取行

    http sqlfiddle com 9 406cb 2 http sqlfiddle com 9 406cb 2 我有一本分类为 1 2 3 4 的表格书 第 1 类 将停留 1 小时 第 2 类 将停留 2 小时 第 3 类 将停留 4
  • 为tableView注册nib名称

    static NSString cellIdentifier cell if tableView tableview1 ContactCustom cell1 ContactCustom tableView dequeueReusableC
  • 当我在 Unix 中调用 fork() 时会发生什么?

    我试图查找这一点 但在调用 fork 后 我很难理解父进程和子进程之间的关系 它们是完全独立的进程 仅通过 id parent id 关联吗 或者他们共享记忆吗 例如每个进程的 代码 部分 是重复的这样每个进程都有自己相同的副本 或者以某种
  • 使用python将mysql查询写入csv,需要显示字段名称

    我有以下内容 import MySQLdb as dbapi import sys import csv dbServer localhost dbPass supersecretpassword dbSchema dbTest dbUse
  • 获取具有匹配计数条件的嵌套对象的文档

    我是一个 mongo 菜鸟 正在使用 mongo 集合 其记录如下所示 cats name fluffy color red name snowball color white 我想执行一个查询来获取包含超过 1 只白猫的所有记录 MapR
  • 在windows和linux上编译

    我是c语言的新手 有些人给了我一些其他人编写的在windows上编译的源代码 尝试在 linux 上编译后出现错误 因为 linux 不支持 DWORD WORD 和 UINT32 例如我有6个文件 A h A c B h B c C h
  • 使用给定数据点在 Python 中曲线拟合指数衰减函数

    随着curve fit通过 SciPy 中的函数 我能够确定代表下图中所示曲线的系数 def func2 t tau return np exp t tau t2 np linspace 0 4 50 y2 func2 t2 1 2 y2
  • 在 OpenGL 中,仅使用 OpenGL3+ 方法创建透视图的最简单方法是什么?

    乍一看这可能听起来很懒 但我已经研究了两天了 我有一个绘制图元的 SDL GLEW 应用程序 我想以不同的视角制作一些视口 我看到了四个视口 但无法更改视角 假设你有 draw swapbuffers 在 OpenGL3 规范中 创建透视视
  • Python @property.setter

    创建装饰器的基本方法是 def my decorator f def f args kwargs do something using f pass return f my decorator def f 但这样你就不能定义像这样的装饰器
  • 如何将 ThreadPool.QueueUserWorkItem 与非静态方法一起使用?

    当我尝试编译时它给了我 错误 1 非静态字段 方法或属性 ConsoleApplication1 Program print string 需要对象引用 ConsoleApplication1 ConsoleApplication1 Pro
  • Httpclient 4.0.3 随机挂起的多个帖子

    让我解释一下情况 我有一个 servlet 将传出 GET POST 重定向到另一个域 某种代理 上的另一个项目 其工作是处理它并返回一些内容 参数和 gif 我使用 HttpClient 4 0 3 来执行此操作 我的应用程序在启动时发送
  • 仅对非空列进行唯一约束

    在MS SQL Server 2008中 是否可以定义UNIQUE CONSTRAINT在列上 但如果非空值则检查 IF 和 ONLY IF 也就是说 会有很多 NULL 应该被忽略 然而 对于非空值 它应该是唯一的 你需要创建一个过滤索引
  • 将基于 json 的日志转换为列格式,即每列一个文件

    日志文件示例 timestamp 2022 01 14T00 12 21 000 Field1 10 Field Doc f1 0 timestamp 2022 01 18T00 15 51 000 Field Doc f1 0 f2 1
  • Go:一个频道有多个听众

    我对 Go 还很陌生 如果主题错误 我很抱歉 但我希望你能理解我的问题 我想通过通道将事件处理到不同的 go 例程 这是一些示例代码 type Event struct Host string Command string Output s
  • 将一个旋转对象包含在另一个旋转对象中 FabricJS

    我有两个对象 一个父对象 红色 和一个子对象 蓝色 父对象是固定的 不能移动 只有子对象是可移动的 并且子对象总是比父对象大 无论以何种方式移动子对象 它都应该始终包含在子对象内部 这意味着我们永远不应该看到红色矩形 Demo https
  • Kotlin 具体化类型参数不支持智能转换

    我正在尝试设置未初始化的值 并试图让以下内容发挥作用 这主要是对具体化泛型的力量 和局限性 的好奇 我试图为数据类的可选参数提供默认值 inline fun