作者:Antonio Leiva

时间:Jul, 4, 2017

原文链接:https://antonioleiva.com/kotlin-from-java/

Kotlin最神奇特性之一是它能与Java完全集成。这就是说尽管你的应用程序的所有代码都是用Java编写的,而你仍然可以在Kotlin中创建一个类,从Java中使用它,且不会出现任何问题。

这有两个好处:

  • 你可以在Java项目中使用Kotlin:在任何已经启动的项目中,你可以现在开始用Kotlin编写新的代码。然后从Java代码中调用它。

  • 如果你对Kotlin还心有余悸,可以在Java中做这个部分:很多人问我在Android上的某些情况下,Kotlin是否有不足。理论上,所有事情都能够胜任,但实际上,还无法知道(目前,还没有人用Kotlin在Android上完成“所有事情”)。事实是,这无关紧要,如果有些操作不能在Kotlin中完成,还可以回Java中去实现它。

今天我们将看看这种兼容性是如何工作的,以及怎样从Java使用Kotlin代码。

软件包级别的函数

在Kotlin中,函数不需要在类中,但Java不是的。那么我们如何调用函数呢?试想一下,我们有一个文件utils.kt,如下所示:

 fun logD(message: String) {
Log.d("", message)
} fun logE(message: String) {
Log.e("", message)
}

在Java中,我们可以通过UtilsKt类来访问它们,并使用一些静态方法:

 UtilsKt.logD("Debug");
UtilsKt.logE("Error");

在之前的文章,你已经看到我喜欢扩展函数。而在Java中,它们如何做?如我们有以下:

 fun ViewGroup.inflate(resId: Int, attachToRoot: Boolean = false): View {
return LayoutInflater.from(context).inflate(resId, this, attachToRoot)
}

注意:

虽然它们可能在某个时候出现,但我还没有明确地对此进行讲解。函数的自变量可能有默认值。这就是说,如果我们不特别指明,它们就使用在声明时指定的值。如我们要在Java中使用,这就阻止我们使用方法重载。

该函数用于ViewGroup。它收到一个布局,并在其父视图使其膨胀。

如果我们要在Java中使用它,会得到什么?

 View v = UtilsKt.inflate(parent, R.layout.view_item, false);

如你所见,应用此函数的对象(接收方)是作为参数添加到函数中。另外,由于在Java中我们不能使用默认值,可选择参数是强制性的。

如果要在Java中生成相应的重载,你可以为该函数使用@JvmOverloads注释。这样,你不需要在Java中指定false:

 @JvmOverloads
fun ViewGroup.inflate(resId: Int, attachToRoot: Boolean = false): View {
return LayoutInflater.from(context).inflate(resId, this, attachToRoot)
}
 View v = UtilsKt.inflate(parent, R.layout.view_item);

如果你希望在Java中使用时指定类名称,则可以使用注释来修改它。在文件utils.kt中,添加在package之前:

 @file:JvmName("AndroidUtils")

现在Java中的类将被命名:

 AndroidUtils.logD("Debug");
AndroidUtils.logE("Error");
View v = AndroidUtils.inflate(parent, R.layout.view_item, false);

实例和静态字段

在Java中,我们使用字段来存储状态。它们可以是实例字段,这意味着每个对象都有自己的,或静态的(所有类的实例都将共享它们)。

如果我们尝试在Kotlin中找到对应的,那么它将是属性和伴随对象。如果我们有这样一个类:

 class App : Application() {

     val appHelper = AppHelper()

     companion object {
lateinit var instance: App
} override fun onCreate() {
super.onCreate()
instance = this
} }

这在Java中是如何工作?您可以简单地访问作为静态字段的伴随对象,以及使用getter和setter的属性:

 AppHelper helper = App.instance.getAppHelper();

你会编译没有问题。作为val,它只生成Java中的getter。如果是var,我们也会有一个setter。

因为它使用了lateinit注释,访问instance已经自动工作,它会自动公开Kotlin用于存储状态的字段。但是假设我们创建一个常数:

 companion object {
lateinit var instance: App
val CONSTANT = 27
}

你会看到你不能直接访问它。你必须通过Companion内部类访问:

 KotlinTest.Companion.getCONSTANT()

谁更好?要在Java中以同样的方式暴露出一个静态字段的方式,你需要一个新的注释:

 @JvmField val CONSTANT = 27

现在可以使用Java代码:

 int c = App.CONSTANT;

如果你在伴随对象中有函数,则可以使用@JvmStatic注释将其转换为静态方法。

结论

你看到了由Java使用Kotlin代码非常简单。在这里我已经展示了一些最典型的事例,其他都可以以非常相似的方式实现。

我希望如果你有任何疑问,这能够说服你开始在项目中使用Kotlin。如果你要认真思考,我建议你阅读这组Kotlin文章,你可以在这里了解更多关于Kotlin的信息。

怎样从Java转换到Kotlin代码:现在就开始使用Kotlin(KAD 29)的更多相关文章

  1. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  2. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

  3. 第二节:Java入门第一行代码

    前言 大家好,今天带来Java入门第一行代码的概述,希望你们喜欢 第一行代码 学习Java基础课程,学会使用eclipse,eclipse为Java集成开发坏境IDE,创建第一个Java源文件代码: ...

  4. kotlin 代码习惯1

    让你的 Kotlin 代码远离 !! 简评:优雅的运用 Kotlin 的 null safety 特性,而不要简单的直接用 !!. 对于 Null 的检查是 Kotlin 的特点之一.强制你在编码过程 ...

  5. 快速书写常见的 Kotlin 代码 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. Java中运行javascript代码

    Java中运行javascript代码 1.Java 代码 2.JS代码 2.1demoWithParams.js 2.2demoWithListParams.js 原文作者:russle 原文地址: ...

  7. Linux系统下Java 转换Word到PDF时,结果文档内容乱码的解决方法

    本文分享在Linux系统下,通过Java 程序代码将Word转为PDF文档时,结果文档内容出现乱码该如何解决.具体可参考如下内容: 1.问题出现的背景 在Windows系统中,使用Spire.Doc ...

  8. 转:java怎么用一行代码初始化ArrayList

    java怎么用一行代码初始化ArrayList 您可以创建一个工厂方法: public static ArrayList<String> createArrayList(String .. ...

  9. java中的静态代码块、构造代码块、构造方法

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

随机推荐

  1. java使用Redis(六个类型)

    下载插件:https://mvnrepository.com/artifact/redis.clients/jedis/3.0.0 maven项目依赖: <dependency> < ...

  2. $Yeasion$的码风修改历程

    总之,今天是一个值得纪念的伟大日子,我将自己的码风进行了彻底的修改,大概是参考了Pks和\(Rqy\)的码风,分为以下几点. 1.变量名.在所有的计算符号之前和之后加空格.如:"&& ...

  3. Nginx自定义模块编写:根据post参数路由到不同服务器

    Nginx自定义模块编写:根据post参数路由到不同服务器 2014-05-05 15:27 blogread IT技术博客 字号:T | T Nginx可以轻松实现根据不同的url 或者 get参数 ...

  4. hdu Hat's Fibonacci(用了kuangbin模板)

    大数的位数设置很坑,设成700会越界,设成800会超空间,最后设成了750居然就过了.... #include <iostream> #include <cstdio> #in ...

  5. RCF的简单使用教程以及什么是回调函数

    RCF的使用教程 RCF(Remote Call Framework)是一个使用C++编写的RPC框架,在底层RCF支持多种传输实现方式(transport implementations). 包括T ...

  6. 19-3-1Python的PyCharm编辑器,以及格式化输出、while循环、运算符、编码初识

    第一次使用PyCharm,需要注意到是否使用的自己安装的python版本,或者使用的自带版本,如果使用的自带版本,注意切换. PyCharm使用优点,可以一步一步看程序的出错问题,即Debug的使用, ...

  7. 创建在类路径资源[applicationcontext]中定义名为“工厂”的bean时出错。:在设置bean属性“dataSource”时,无法解析对bean“dataSource”的引用;嵌套异常是org.springframe .beans.factory。BeanCreationException:创建名为“数据源”的bean时出错,该名称是在类路径资源[applicationcontext

    控制台报错: 创建在类路径资源[applicationcontext]中定义名为“工厂”的bean时出错.:在设置bean属性“dataSource”时,无法解析对bean“dataSource”的引 ...

  8. linux中删除文件内空白行的几种方法。

    linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...

  9. hadoop生态搭建(3节点)-16.elk配置

    # ==================================================================ELK环境准备 # 修改文件限制 # * 代表Linux所有用户 ...

  10. Ubuntu中 MySQL 的中文编码问题

    使用Ubuntu在安装好MySQL数据库之后,如果直接创建数据库,再创建数据表,那么是无法向字段插入中文的,会报Incorrect string value错误. c实现编码设置的两种方法: (1)动 ...