# FAQ
[TOC]
### Kotlin 是什么?
Kotlin 是一门面向 JVM、Android、JavaScript 以及原生平台的开源(OSS)静态类型编程语言。它是由 [JetBrains](http://www.jetbrains.com) 开发的。该项目开始于 2010 年并且很早就已开源。第一个官方 1.0 版发布于 2016 年 2 月。
### Kotlin 的当前版本是多少?
目前发布的版本是1.3.50,发布于2019-08-22。
### Kotlin 是免费的吗?
是。Kotlin 是免费的,已经免费并会保持免费。它是遵循 Apache 2.0 许可证开发的,其源代码可以在 [GitHub](https://github.com/jetbrains/kotlin) 上获得。
### Kotlin 是面向对象还是函数式语言?
Kotlin 既具有面向对象又具有函数式结构。你既可以按 OO 风格也可以按 FP 风格使用,还可以混合使用两种风格。
通过对诸如高阶函数、函数类型和 lambda 表达式等功能的一等支持,Kotlin 是一个很好的选择,如果你正在进行或探索函数式编程的话。
### Kotlin 能给我超出 Java 语言的哪些优点?
Kotlin 更简洁。粗略估计显示,代码行数减少约 40%。它也更安全,例如对不可空类型的支持使应用程序不易发生 NPE。其他功能包括智能类型转换、高阶函数、扩展函数和带接收者的 lambda 表达式,提供了编写富于表现力的代码的能力以及易于创建 DSL 的能力。
### Kotlin 与 Java 语言兼容吗?
兼容。Kotlin 与 Java 语言可以 100% 互操作,并且主要强调确保你现有的代码库可以与Kotlin 正确交互。你可以轻松地在 Java 中调用 Kotlin 代码以及在 Kotlin 中调用 Java 代码。 这使得采用 Kotlin更容易、风险更低。内置于 IDE 的自动化 Java 到 Kotlin 转换器可简化现有代码的迁移。
### 我可以用 Kotlin 做什么?
Kotlin 可用于任何类型的开发,无论是服务器端、客户端 Web 还是 Android。随着原生 Kotlin(Kotlin/Native)目前的进展,对其他平台(如嵌入式系统、macOS 和 iOS)的支持即将就绪。人们将 Kotlin 用于移动端和服务器端应用程序、使用 JavaScript 或 JavaFX的客户端、以及数据科学,仅举这几例。
### 我可以用 Kotlin 进行 Android 开发吗?
可以。Kotlin 已作为 Android 平台的一等语言而支持。已经有数百种应用程序在使用 Kotlin用于 Android 开发,比如 Basecamp、Pinterest 等等。更多信息请查看 [Android 开发资源](http://www.kotlincn.net/docs/reference/android-overview.html)。
### 我可以用 Kotlin 进行服务器端开发吗?
可以。Kotlin 与 JVM 100% 兼容,因此你可以使用任何现有的框架,如 Spring Boot、vert.x 或 JSF。另外还有一些 Kotlin 写的特定框架,例如 [Ktor](https://ktor.kotlincn.net)。
更多信息请查看[服务器端开发资源](http://www.kotlincn.net/docs/reference/server-overview.html)。
### 我可以用 Kotlin 进行 web 开发吗?
可以。除了用于后端 Web,你还可以使用 Kotlin/JS 用于客户端 Web。Kotlin 可以使用[DefinitelyTyped](http://definitelytyped.org) 中的定义来获取常见 JavaScript 库的静态类型版,并且它与现有的模块系统(如 AMD 和 CommonJS)兼容。
更多信息请查看[客户端开发中的资源](http://www.kotlincn.net/docs/reference/js-overview.html)。
### 我可以用 Kotlin 进行桌面开发吗?
可以。你可以使用任何 Java UI 框架如 JavaFx、Swing 或其他框架。另外还有 Kotlin 特定框架,如 [TornadoFX](https://github.com/edvin/tornadofx)。
### 我可以用 Kotlin 进行原生开发吗?
原生 Kotlin(Kotlin/Native)目前[正在准备中](https://blog.jetbrains.com/kotlin/tag/native/)。它将 Kotlin 编译为以无需 VM 运行的原生代码。有一个技术预览发布版,但它还不能用于生产,并且 1.0 我们还没有面向所有平台支持的计划。更多信息请查看 [Kotlin/Native 博文公告](https://blog.jetbrains.com/kotlin/2017/04/kotlinnative-tech-preview-kotlin-without-a-vm/)。
### 哪些 IDE 支持 Kotlin?
所有主要的 Java IDE 都支持 Kotlin,包括 [IntelliJ IDEA](https://www.kotlincn.net/docs/tutorials/getting-started.html)、[Android Studio](https://www.kotlincn.net/docs/tutorials/kotlin-android.html)、[Eclipse](https://www.kotlincn.net/docs/tutorials/getting-started-eclipse.html) 和[NetBeans](http://plugins.netbeans.org/plugin/68590/kotlin)。另外,有一个[命令行编译器](https://www.kotlincn.net/docs/tutorials/command-line.html)可用,为编译和运行应用程序提供了直接的支持。
### 哪些构建工具支持 Kotlin?
在 JVM 端,主要构建工具包括 [Gradle](http://www.kotlincn.net/docs/reference/using-gradle.html)、[Maven](http://www.kotlincn.net/docs/reference/using-maven.html)、[Ant](http://www.kotlincn.net/docs/reference/using-ant.html) 和 [Kobalt](http://beust.com/kobalt/home/index.html)。还有一些可用于构建客户端 JavaScript 的构建工具。
### Kotlin 会编译成什么?
当面向JVM 平台时,Kotlin 生成 Java 兼容的字节码。当面向 JavaScript 时,Kotlin 会转译到 ES5.1,并生成与包括 AMD 和 CommonJS 在内的模块系统相兼容的代码。当面向原生平台时,Kotlin 会(通过 LLVM)生成平台相关的代码。
### Kotlin 只面向 Java 6 吗?
不是。Kotlin 可以让你选择生成 Java 6 或者 Java 8 兼容的字节码。可以为较高版本的平台生成更优化的字节码。
### Kotlin 难吗?
Kotlin 是受 Java、C#、JavaScript、Scala 以及 Groovy 等现有语言的启发。我们已经努力确保 Kotlin 易于学习,
所以人们可以在几天之内轻松转向、阅读和编写 Kotlin。学习惯用的 Kotlin 和使用更多它的高级功能可能需要一点时间,但总体来说这不是一个复杂的语言。
### 哪些公司使用 Kotlin?
有太多使用 Kotlin 的公司可列,而有些更明显的公司已经公开宣布使用 Kotlin,分别通过博文、Github 版本库或者演讲宣布,包括[Square](https://medium.com/square-corner-blog/square-open-source-loves-kotlin-c57c21710a17)、 [Pinterest](https://www.youtube.com/watch?v=mDpnc45WwlI)、 [Basecamp](https://m.signalvnoise.com/how-we-made-basecamp-3s-android-app-100-kotlin-35e4e1c0ef12) 还有 [Corda](https://docs.corda.net/releases/release-M9.2/further-notes-on-kotlin.html)。
### 谁开发 Kotlin?
Kotlin 主要由 JetBrains 的一个工程师团队开发(目前团队规模为 50+)。其首席语言设计师是[Andrey Breslav](https://twitter.com/abreslav)。除了核心团队,GitHub 上还有 250 多个外部贡献者。
### 在哪里可以了解关于 Kotlin 更多?
最好的起始地方好是[本网站](https://www.kotlincn.net)(原文是[英文官网](https://kotlinlang.org))。从那里你可以下载编译器、[在线尝试](https://play.kotlinlang.org)以及访问资源、[参考文档](http://www.kotlincn.net/docs/reference/index.html)和[教程](https://www.kotlincn.net/docs/tutorials/index.html)。
### 有没有关于 Kotlin 的书?
已经有[一些](http://www.kotlincn.net/docs/books.html)关于 Kotlin 的图书。其中包括由 Kotlin 团队成员 Dmitry Jemerov 和 Svetlana Isakova 合著的 [Kotlin in Action](https://www.manning.com/books/kotlin-in-action)、面向 Android 开发人员的 [Kotlin for Android Developers](https://leanpub.com/kotlin-for-android-developers)。
### Kotlin 有没有在线课程?
有一些 Kotlin 的课程,包括 Kevin Jones 的 [Pluralsight Kotlin Course](https://www.pluralsight.com/courses/kotlin-getting-started)、Hadi Hariri 的 [O’Reilly Course](http://shop.oreilly.com/product/0636920052982.do) 以及 Peter Sommerhoff 的 [Udemy Kotlin Course](http://petersommerhoff.com/dev/kotlin/kotlin-beginner-tutorial/)。
在 YouTube 和 Vimeo 上也有许多 [Kotlin 演讲](https://www.kotlincn.net/community/talks.html) 的录像。
### 有没有 Kotlin 社区?
有。Kotlin 有一个非常有活力的社区。Kotlin 开发人员常出现在 [Kotlin 论坛](http://discuss.kotlinlang.org)、
[StackOverflow](http://stackoverflow.com/questions/tagged/kotlin) 上并且更积极地活跃在 [Kotlin Slack](http://slack.kotlinlang.org)(截至 2018 年 10 月有近 20000 名成员)上。
### 有没有 Kotlin 活动?
有。现在有很多用户组和集会组专注于 Kotlin。你可以[在网站上找到一个列表](http://www.kotlincn.net/user-groups/user-group-list.html)。此外,还有世界各地的社区组织的 [Kotlin 之夜](http://www.kotlincn.net/community/kotlin-nights.html)活动。
### 有没有 Kotlin 大会?
有。官方的年度 [KotlinConf](https://kotlinconf.com/) 由 JetBrains 主办。分别于 [2017 年](https://kotlinconf.com/2017/) 在旧金山、2018 年在阿姆斯特丹举行。Kotlin 也会在全球不同地方举行大会。你可以在[网站上找到即将到来的会谈列表](http://www.kotlincn.net/community/talks.html?time=upcoming)。
### Kotlin 上社交媒体吗?
上。最活跃的 Kotlin 帐号是 [Twitter 上的](https://twitter.com/kotlin)。
### 其他在线 Kotlin 资源呢?
网站上有一堆[在线资源](https://kotlinlang.org/community/),包括社区成员的 [Kotlin 文摘](https://kotlin.link)、[通讯](http://www.kotlinweekly.net)、[播客](https://talkingkotlin.com)等等。
### 在哪里可以获得高清 Kotlin 徽标?
徽标可以在[这里](https://resources.jetbrains.com/storage/products/kotlin/docs/kotlin_logos.zip)下载。
使用该徽标时,请遵循压缩包中的 `guidelines.pdf` 以及 [Kotlin 品牌使用指南](/foundation/guidelines.html) 中的简单规则。
- 前言
- Kotlin简介
- IntelliJ IDEA技巧总结
- idea设置类注释和方法注释模板
- 像Android Studion一样创建工程
- Gradle
- Gradle入门
- Gradle进阶
- 使用Gradle创建一个Kotlin工程
- 环境搭建
- Androidstudio平台搭建
- Eclipse的Kotlin环境配置
- 使用IntelliJ IDEA
- Kotlin学习路线
- Kotlin官方中文版文档教程
- 概述
- kotlin用于服务器端开发
- kotlin用于Android开发
- kotlin用于JavaScript开发
- kotlin用于原生开发
- Kotlin 用于数据科学
- 协程
- 多平台
- 新特性
- 1.1的新特性
- 1.2的新特性
- 1.3的新特性
- 开始
- 基本语法
- 习惯用法
- 编码规范
- 基础
- 基本类型
- 包与导入
- 控制流
- 返回与跳转
- 类与对象
- 类与继承
- 属性与字段
- 接口
- 可见性修饰符
- 扩展
- 数据类
- 密封类
- 泛型
- 嵌套类
- 枚举类
- 对象
- 类型别名
- 内嵌类
- 委托
- 委托属性
- 函数与Lambda表达式
- 函数
- Lambda表达式
- 内联函数
- 集合
- 集合概述
- 构造集合
- 迭代器
- 区间与数列
- 序列
- 操作概述
- 转换
- 过滤
- 加减操作符
- 分组
- 取集合的一部分
- 取单个元素
- 排序
- 聚合操作
- 集合写操作
- List相关操作
- Set相关操作
- Map相关操作
- 多平台程序设计
- 平台相关声明
- 以Gradle创建
- 更多语言结构
- 解构声明
- 类型检测与转换
- This表达式
- 相等性
- 操作符重载
- 空安全
- 异常
- 注解
- 反射
- 作用域函数
- 类型安全的构造器
- Opt-in Requirements
- 核心库
- 标准库
- kotlin.test
- 参考
- 关键字与操作符
- 语法
- 编码风格约定
- Java互操作
- Kotlin中调用Java
- Java中调用Kotlin
- JavaScript
- 动态类型
- kotlin中调用JavaScript
- JavaScript中调用kotlin
- JavaScript模块
- JavaScript反射
- JavaScript DCE
- 原生
- 并发
- 不可变性
- kotlin库
- 平台库
- 与C语言互操作
- 与Object-C及Swift互操作
- CocoaPods集成
- Gradle插件
- 调试
- FAQ
- 协程
- 协程指南
- 基础
- 取消与超时
- 组合挂起函数
- 协程上下文与调度器
- 异步流
- 通道
- 异常处理与监督
- 共享的可变状态与并发
- Select表达式(实验性)
- 工具
- 编写kotlin代码文档
- 使用Kapt
- 使用Gradle
- 使用Maven
- 使用Ant
- Kotlin与OSGI
- 编译器插件
- 编码规范
- 演进
- kotlin语言演进
- 不同组件的稳定性
- kotlin1.3的兼容性指南
- 常见问题
- FAQ
- 与Java比较
- 与Scala比较(官方已删除)
- Google开发者官网简介
- Kotlin and Android
- Get Started with Kotlin on Android
- Kotlin on Android FAQ
- Android KTX
- Resources to Learn Kotlin
- Kotlin样品
- Kotlin零基础到进阶
- 第一阶段兴趣入门
- kotlin简介和学习方法
- 数据类型和类型系统
- 入门
- 分类
- val和var
- 二进制基础
- 基础
- 基本语法
- 包
- 示例
- 编码规范
- 代码注释
- 异常
- 根类型“Any”
- Any? 可空类型
- 可空性的实现原理
- kotlin.Unit类型
- kotlin.Nothing类型
- 基本数据类型
- 数值类型
- 布尔类型
- 字符型
- 位运算符
- 变量和常量
- 语法和运算符
- 关键字
- 硬关键字
- 软关键字
- 修饰符关键字
- 特殊标识符
- 操作符和特殊符号
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- this关键字
- super关键字
- 操作符重载
- 一元操作符
- 二元操作符
- 字符串
- 字符串介绍和属性
- 字符串常见方法操作
- 字符串模板
- 数组
- 数组介绍创建及遍历
- 数组常见方法和属性
- 数组变化以及下标越界问题
- 原生数组类型
- 区间
- 正向区间
- 逆向区间
- 步长
- 类型检测与类型转换
- is、!is、as、as-运算符
- 空安全
- 可空类型变量
- 安全调用符
- 非空断言
- Elvis操作符
- 可空性深入
- 可空性和Java
- 函数
- 函数式编程概述
- OOP和FOP
- 函数式编程基本特性
- 组合与范畴
- 在Kotlin中使用函数式编程
- 函数入门
- 函数作用域
- 函数加强
- 命名参数
- 默认参数
- 可变参数
- 表达式函数体
- 顶层、嵌套、中缀函数
- 尾递归函数优化
- 函数重载
- 控制流
- if表达式
- when表达式
- for循环
- while循环
- 循环中的 Break 与 continue
- return返回
- 标签处返回
- 集合
- list集合
- list集合介绍和操作
- list常见方法和属性
- list集合变化和下标越界
- set集合
- set集合介绍和常见操作
- set集合常见方法和属性
- set集合变换和下标越界
- map集合
- map集合介绍和常见操作
- map集合常见方法和属性
- map集合变换
- 集合的函数式API
- map函数
- filter函数
- “ all ”“ any ”“ count ”和“ find ”:对集合应用判断式
- 别样的求和方式:sumBy、sum、fold、reduce
- 根据人的性别进行分组:groupBy
- 扁平化——处理嵌套集合:flatMap、flatten
- 惰性集合操作:序列
- 区间、数组、集合之间转换
- 面向对象
- 面向对象-封装
- 类的创建及属性方法访问
- 类属性和字段
- 构造器
- 嵌套类(内部类)
- 枚举类
- 枚举类遍历&枚举常量常用属性
- 数据类
- 密封类
- 印章类(密封类)
- 面向对象-继承
- 类的继承
- 面向对象-多态
- 抽象类
- 接口
- 接口和抽象类的区别
- 面向对象-深入
- 扩展
- 扩展:为别的类添加方法、属性
- Android中的扩展应用
- 优化Snackbar
- 用扩展函数封装Utils
- 解决烦人的findViewById
- 扩展不是万能的
- 调度方式对扩展函数的影响
- 被滥用的扩展函数
- 委托
- 委托类
- 委托属性
- Kotlin5大内置委托
- Kotlin-Object关键字
- 单例模式
- 匿名类对象
- 伴生对象
- 作用域函数
- let函数
- run函数
- with函数
- apply函数
- also函数
- 标准库函数
- takeIf 与 takeUnless
- 第二阶段重点深入
- Lambda编程
- Lambda成员引用高阶函数
- 高阶函数
- 内联函数
- 泛型
- 泛型的分类
- 泛型约束
- 子类和子类型
- 协变与逆变
- 泛型擦除与实化类型
- 泛型类型参数
- 泛型的背后:类型擦除
- Java为什么无法声明一个泛型数组
- 向后兼容的罪
- 类型擦除的矛盾
- 使用内联函数获取泛型
- 打破泛型不变
- 一个支持协变的List
- 一个支持逆变的Comparator
- 协变和逆变
- 第三阶段难点突破
- 注解和反射
- 声明并应用注解
- DSL
- 协程
- 协程简介
- 协程的基本操作
- 协程取消
- 管道
- 慕课霍丙乾协程笔记
- Kotlin与Java互操作
- 在Kotlin中调用Java
- 在Java中调用Kotlin
- Kotlin与Java中的操作对比
- 第四阶段专题练习
- 朱凯Kotlin知识点总结
- Kotlin 基础
- Kotlin 的变量、函数和类型
- Kotlin 里那些「不是那么写的」
- Kotlin 里那些「更方便的」
- Kotlin 进阶
- Kotlin 的泛型
- Kotlin 的高阶函数、匿名函数和 Lambda 表达式
- Kotlin协程
- 初识
- 进阶
- 深入
- Kotlin 扩展
- 会写「18.dp」只是个入门——Kotlin 的扩展函数和扩展属性(Extension Functions / Properties)
- Kotlin实战-开发Android