技术标签: Android
我们可以在运行时通过使用 is
操作符或其否定形式 !is
来检查对象是否符合给定类型:
if (obj is String) {
print(obj.length)
}
if (obj !is String) { // 与 !(obj is String) 相同
print("Not a String")
}
else {
print(obj.length)
}
在许多情况下,不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is-检查以及显式转换,并在需要时自动插入(安全的)转换:
fun demo(x: Any) {
if (x is String) {
print(x.length) // x 自动转换为字符串
}
}
编译器足够聪明,能够知道如果反向检查导致返回那么该转换是安全的:
if (x !is String) return
print(x.length) // x 自动转换为字符串
或者在 && 和 || 的右侧:
// `||` 右侧的 x 自动转换为字符串
if (x !is String || x.length == 0) return
// `&&` 右侧的 x 自动转换为字符串
if (x is String && x.length > 0) {
print(x.length) // x 自动转换为字符串
}
这些 智能转换 用于 when-表达式 和 while-循环 也一样:
when (x) {
is Int -> print(x + 1)
is String -> print(x.length + 1)
is IntArray -> print(x.sum())
}
请注意,当编译器不能保证变量在检查和使用之间不可改变时,智能转换不能用。 更具体地,智能转换能否适用根据以下规则:
通常,如果转换是不可能的,转换操作符会抛出一个异常。因此,我们称之为不安全的。 Kotlin 中的不安全转换由中缀操作符 as(参见operator precedence)完成:
val x: String = y as String
请注意,null 不能转换为 String 因该类型不是可空的, 即如果 y 为空,上面的代码会抛出一个异常。 为了匹配 Java 转换语义,我们必须在转换右边有可空类型,就像:
val x: String? = y as String?
为了避免抛出异常,可以使用安全转换操作符 as?,它可以在失败时返回 null:
val x: String? = y as? String
请注意,尽管事实上 as? 的右边是一个非空类型的 String,但是其转换的结果是可空的。
busybox / linux / uboot 源码在线阅读 http://elixir.free-electrons.com/linux/latest/source_开源在线阅读项目
展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的10年的路程,有些心得体会你可以借鉴一下,觉得说得有道理的你就接纳,觉得说得没道理的,你就抛弃,以下是我发自内心的,给大家的忠告,特别是针对那些小弟弟妹妹们。01. 自己的户口档案、养老保险
nonlinear programming 具有非线性约束条件或目标函数的数学规划,是运筹学的一个重要分支。非线性规划研究一个 n元实函数在一组等式或不等式的约束条件下的极值问题,且目标函数和约束条件至少有一个是未知量的非线性函数。目标函数和约束条件都是线性函数的情形则属于线性规划。 简史 非线性规划是20世纪50年代才开始形成的一门新兴学科。1951年H.W.库恩和A.W.塔克发
上周,在某多多搬砖的一位朋友在微信上找我咨询,说他们公司一个ES集群从2.4升级到5.5以后,一个很简单的Query查询耗时突然从几十毫秒,变成800-1000毫秒,几十倍的性能下降!原始问题链接:# Why my search slow?这个查询非常简单,就是3个过滤条件求并集而已:{ "from": 0, "size": 10, "query": { ..._build_scorer
inline函数不报重定义错误浅析1 问题背景关键字inline用于建议编译器在调用处展开被修饰的函数,但最终是否展开取决于编译器的行为gcc配置参数-O0时不会进行编译优化,inline关键字不生效gcc配置参数-O2时会进行编译优化,inline关键字生效C/C++语法中,如果变量、函数在同一个工程中被多次定义,链接期间会报类似“对 xxx 多重定义”的错误;inline函数如果会在多处被调用,则需要将函数的定义写在头文件中注:当inline函数的声明和定义分别在头文件和_inline 编译重定义错误
如题,Artifactory在打包发布到本地仓库到时候,生成的pom文件可能会不包含dependencies。可以手动查找、添加build.gradle中包含的dependencies到最终生成到pom文件。添加步骤:使用implementation增加编译是需要导入的外部引用:dependencies { implementation 'org.jetbrains.kotl..._发版后pom没了
Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核心组件组件:BufferChannelSelector一.Channel是一个通道,它就像自来水管一样,网络数据通过 Channel 这根水管读取和写入。传统的 IO 是基于流进行操作的.常见的channel实现类有:1.FileChannel: 读写文本数据 public static void main(String[] args) t_netty封装了java nio的
在进行三维重建中常用pcd文件格式进行操作,将得到的txt文件格式转化就变得必不可少。#include#include#include #include #include #include using namespace std;typedef struct tagPOINT_3D{ double x; //mm world coordinate x double y;_三维重建 文件格式
Unity2020.3安装DOTS1.首先打开Package Manager2.我们把Preview和Dependencies打开 方便我们观察3.加入Hybrid Renderer在Package Manager左上角的加号上选择Add package from git URL 并填写以下地址com.unity.rendering.hybrid下载需要等待一段时间在Hybrid Renderer依赖中可以看到0.17最新版的Entities在Entities包中可以看见依赖了
书看了大半,天马行空似懂非懂。返回头看看感觉没学到什么东西,所以还是动手尝试下。实际这个解析器只是sqlite语法的一个create table语法,而且也没完全实现(不支持check约束和指定数据库)。 为了定一个模子我先写了一个create table 的antlr文法(如下)照着做的。grammar sqlitcreatetable;@membe...
现在你已经成功地在 Ubuntu 上安装了 Java 1.8,可以开始使用它来运行你的 Java 应用程序了。安装期间,你可能需要输入 sudo 密码以确认安装。_ubuntu 安装java1.8
图论的基础知识有向图无向图矩阵1.邻接矩阵2.入度矩阵3.拉普拉斯矩阵有向图加权有向图 G 可以用 (V,E)(V,E)(V,E)来表示,在这里 V={1,2,⋯,n}V=\{1,2,⋯,n\}V={1,2,⋯,n} 代表图的非空点集,E={(i,j),i,j∈V,i≠j}E=\{(i,j),i,j∈V,i≠j\}E={(i,j),i,j∈V,i̸=j} 代表图的边集。图 G 中的有向边(i..._入度矩阵