首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么有@JvmStatic但从java调用仍然需要'Companion‘

@JvmStatic是Kotlin语言中的注解,用于将一个成员函数或属性标记为静态的。在Kotlin中,没有静态成员的概念,因此使用@JvmStatic可以将一个成员标记为与Java中的静态成员相对应。

在Kotlin中,如果一个类定义了一个伴生对象(companion object),那么该伴生对象的成员在Java中将被视为该类的静态成员。但是,由于Java中没有伴生对象的概念,因此在Java中调用伴生对象的成员时,需要通过"Companion"这个额外的标识符来访问。

例如,假设有一个Kotlin类定义如下:

代码语言:kotlin
复制
class MyClass {
    companion object {
        @JvmStatic
        fun myStaticMethod() {
            // 静态方法的实现
        }
    }
}

在Kotlin中,可以直接通过MyClass.myStaticMethod()调用该静态方法。但是在Java中,需要使用MyClass.Companion.myStaticMethod()来调用该静态方法。

这是因为Kotlin编译器在生成字节码时,会为伴生对象生成一个名为"Companion"的静态内部类,用于在Java中访问伴生对象的成员。通过使用@JvmStatic注解,可以告诉编译器将该方法或属性生成为Java中的静态成员,从而使得在Java中调用时更加方便。

总结起来,使用@JvmStatic注解可以让Kotlin中的伴生对象的成员在Java中以静态成员的方式调用,但由于Java中没有伴生对象的概念,因此需要通过"Companion"这个额外的标识符来访问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Kotlin】Kotlin 与 Java 互操作 ② ( @JvmField 注解字段给 Java | @JvmOverloads 注解修饰函数 | @JvmStatic 注解声明静态成员 )

直接传入 想要的参数即可 ; 但是在 Java 调用 Kotlin 函数 中 , Java 语言不支持 函数参数 自带默认值的 语法 , 如果传入指定的参数 , 就需要对函数进行重载 ; 在 Kotlin...中调用 Kotlin 默认参数函数 如果 在 Java 代码中 , 想要 像 Kotlin 那样传入任意个数和类型的参数 , 就需要使用 函数重载实现 ; 如果 直接像 Kotlin 中那样调用 ,...注解声明静态成员 ---- 在 Kotlin 中 , 没有静态成员概念 , 需要声明静态成员时 , 一般都在其 Companion 伴生对象中声明 ; 在 Java调用 Kotlin 的 Companion...伴生对象 中的成员时 , 需要通过如下形式进行调用 : Kotlin类.Companion.成员属性 Kotlin类.Companion.成员函数 如果想要 在不使用 Companion 的前提下 直接调用...Java 中可以按照静态成员的方式进行访问 ; 1、Java 正常访问 Kotlin 伴生对象成员 在下面的代码中 , 在 Java 语言中访问 Kotlin 伴生对象成员 , 需要先获取 Hello.Companion

1K30
  • 当Kotlin邂逅设计模式之单例模式(一)

    2、Kotlin中设计模式的实现和Java的实现在某些方面还是很大的差别的,利用Kotlin语言自身的特性实现设计模式比硬生生套用Java中的设计模式实现要更优雅和更高效。...object { //通过@JvmStatic注解,使得在Java调用instance直接是像调用静态函数一样, //类似KLazilyDCLSingleton.getInstance...KLazilyDCLSingleton.getInstance().doSomething(); //没有加@JvmStatic注解,只能这样通过Companion调用 KLazilyDCLSingleton.Companion.getInstance...().doSomething(); } } 注意: 建议上面例子中添加@JvmStatic注解,Kotlin这门语言可谓是操碎了心,做的很小心翼翼,为了不让Java开发者打破他们的调用习惯,让调用根本无法感知到是...();//这里可以看到加了@JvmStatic注解后,getInstance内部把我们省略Companion.getInstance()这一步,这样一来Java调用者就直接KLazilyDCLSingleton.getInstance

    96130

    Android面试题之Kotlin和Java之间互操作

    generateName()) } 类型映射 kotlin代码运行时,所有的映射类型都会重新映射回对应得Java类型 属性访问 不需要调用相关setter和getter方法,可以用赋值语法来设置一个Java...()); //用JvmName改了名字后 System.out.printf(Hero.sayHello()); @JvmField 用@JvmField修饰后,Java中可以直接调用属性,不用getter...@JvmField注解还能用来以静态方式提供伴生对象里定义的值 @JvmStatic注解的作用类似于@JvmField,允许你直接调用伴生对象的函数 //互操作 class SpellBook {...= spellBook.MAX_SPELL_COUNT; spellBook.Companion.getSpell(); //加了@JvmStatic修饰以后...spellBook.getSpell(); } } @Throws 抛出一个需要检查的指定异常,Java和kotlin有关的异常检查的差异让@Throws注解解决了,在编写供Java开发者调用

    8310

    【Jetpack】DataBinding 架构组件 ② ( 字符串拼接函数 | 绑定点击事件函数 | DataBinding 布局中使用 import 标签导入 Java、Kotlin 类 )

    object 伴生对象 定义 Java 静态方法 , 接收一个值 , 拼接字符串 ; 在 Kotlin 中定义 Java 静态方法 : 需要companion object 伴生对象 中使用 @JvmStatic...注解修饰函数 ; 在 Kotlin 中定义 Java 静态成员 : 需要companion object 伴生对象 中使用 @JvmField 注解修饰字段 ; 特别注意 : 只有在 companion...{ companion object { @JvmStatic fun nameText(name: String): String {...companion object 伴生对象 中使用 @JvmStatic 注解修饰函数 , 才能定义 Java 静态函数 ; package kim.hsl.databinding_demo class...KotlinStudentUtils { companion object { @JvmStatic fun nameText(name: String): String

    60050

    Kotlin | 与Java互调的那些事

    ,如下: 比如我们一个顶级扩展函数,位于 UiExpand.kt 中: fun Int.px() {} Java调用 //Java调用kotlin类-(UiExpand)-Int.px() 扩展方法...中,我们去调用Kotlin 的 成员变量 时,编译器都会帮我们自动生成相应的 get,set方法,这很符合Java Bean的写法,但是有些是我们只是想直接去调用,这个时候就可以这样去做。...); testKotlinBean.getTitle(); Java调用Kt-伴生对象 @JvmStatic 当我们在Java调用 Kotlin 伴生对象的方法或者变量时,必须通过 类名.Companion.xx...这时候,我们就可以增加 @JvmStatic 来直接调用。...} } } 在Java调用 ToLog.toLog(); ToLog.getTime(); 不过需要注意的是,@JvmStatic 对性能没有任何提升,因为相应的,编译器又生成了一个静态方法

    96230

    Android 列表视频

    视频组件选择 使用的是b站开源的ijk播放器 组件布局 正常的列表视频在视频加载完成之前肯定是要显示图片,视频加载好后在播放视频,ijk中没有发现视频缩略图的选项,所以布局使用一个帧布局,用张图片把...VideoView盖住,当视频加载好后再把图片去掉(为什么不是VideoView盖住图片,如果这样的话再把VideoView展示出来的时候会有一个黑屏,比较影响体验) <FrameLayout...所以需要加haveVideo来判断这个item是否视频 // playState == VideoView.STATE_PLAYING 由于ijk没有视频准备好的回调,...private fun getVisibleItems(recyclerView: RecyclerView): List { val videoList = java.util.ArrayList...= RecyclerView.SCROLL_STATE_SETTLING,这个情况下就不需要调用这个了,要不然会比较卡 fun adjustVideo(recyclerView: RecyclerView

    93230

    在 Kotlin 中使用 Dagger 会遇到的陷阱和优化方法

    Dagger 是通过 Java 的注解模型实现的,而 Kotlin 中注解的编写方式同 Java 的并不是一一对应的,这篇文章会重点介绍它们之间的不同之处,并且会介绍怎样轻松地将 Dagger 同 Kotlin...{ return OkHttpClient.Builder().build() } } 如果需要使用抽象方法,则需要将 @JvmStatic 添加到 companion object...@Binds abstract fun provideService(retrofitService: RetrofitService): Service @Module companion...泛型注入 Kotlin 使用通配符编译泛型使 Kotlin API 和 Java 能一起使用。当某个参数或者字段的类型为 泛型 时,会在 Java 代码中自动生成。...配置 NetworkPrinter,不是一个普通的 Printer fun providePrinter() = NetworkPrinter() Dagger 基本上是同 Kotlin 兼容的,但是您仍然要注意

    1.1K30

    Kotlin使用静态变量与静态方法详解

    前言 在日常开发过程中,静态变量和 静态方法 是我们常见的用法,Java中相信大家并不陌生了,那么在 Kotlin 中该如何使用呢?...其实很简单,只需要一个将变量和方法包含在 companion object 域中即可,比如这样: class Constant { companion object { // 接口根地址 const...(Constant.Companion.WECHAT_APP_ID, Constant.WECHAT_APP_SECRET) PlatformConfig.setSinaWeibo(Constant.Companion.WEIBO_APP_KEY...我们可以借助于注解 @JvmField 和 @JvmStatic 来分别标注静态变量和静态方法,之后我就能在Java代码中像以前方式那样直接使用静态的成员啦!...var errorCode = NetRequestStatus.UNKNOWN_ERROR @JvmField var errorMessage = "请求失败,请稍后重试" @JvmStatic

    2.8K20

    Kotlin之旅——类特性

    类的扩展 在 Java 开发的时候,经常会写一大堆的 Utils 类,甚至经常写一些common包,比如著名的 apache-commons系列、Guava等等。...Kotlin 一个很好的特性,叫 智能转换(smart cast),在我之前的文章中也提到过。就是当已经确定一个对象的类型后,可以自动识别为这个类的对象,而不用再手动强转。...如果你需要写一个可以无需用一个类的实例来调用、但需要访问类内部的函数(例如,工厂方法或单利),你可以把它写成一个用 companion修饰的对象内的方法。...如果只是简单的写,直接用伴生对象返回一个 val 修饰的外部类对象就可以了,但是更多的时候我们希望在类被调用的时候才去初始化他的对象。...这样不仅维护网络请求信息方便,而且每个类不会有额外多出来的方法防止新人接触项目的时候调用错请求方法。

    89520

    Better Kotlin

    同时多次调用相同的返回值。 因此上面提到的,自定义 getter 方法并随着当前时间的不同而返回不同的值违反了最后一条原则。大家也要尽量的避免这种情况。...直接读取一个常量不同,Kotlin 访问一个伴生对象的私有常量字段需要经过以下方法: 调用伴生对象的静态方法 调用伴生对象的实例方法 调用主类的静态方法 读取主类中的静态字段 为了访问一个常量,而多花费调用...讲到这,自然也就知道了 Kotlin 对 object 的三个作用: 简化生成静态内部类 生成匿名内部类对象 生成单例对象 咳咳,说了那么多,到底和 @JvmStatic 和 @JvmField 啥关系呢...所以我强烈建议大家在 object 和 companion object 中分别为变量和方法增加上 @JvmField 和 @JvmStatic 注解。...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是了下面的代码。

    1.3K20

    kotlin--与Java互操作

    操作Java对象时,我们必要加上判空符 Java: public class MyClass { public String value; public String getCanNullValue...二、属性、异常互操作 1.属性访问 我们可以直接使用 "= " 对Java属性进行赋值了,对于受保护的属性,Java需要实现对应的get、set方法 Java: public class MyClass...@JvmOverloads kotlin函数中可以给入参默认值,然后调用的时候不必传入,Java不行,如果想要Java调用时,也支持,使用@JvmOverloads注解,它会帮助kotlin产生函数的重载版本...@JvmStatic @JvmField注解还能使Java用来以静态方式获取伴生对象的属性 @JvmStatic则允许Java直接调用伴生对象的函数 class JavaToKotlin {...kotlin函数类型使用FunctionN这样的名字的接口来表示,N代表入参的个数,一共有24个这样的接口,从Function0到Function23,每个接口都包含一个invoke函数,调用匿名函数需要调用

    51320

    快速上手 Kotlin 11 招

    JvmStatic 这个注解会将 getInstance 这个方法编译成与 Java 的静态方法一样的签名,如果不加这个注解,Java 当中无法像调用 Java 静态方法那样调用这个方法。...如何写三元运算符 Java 可以写三元运算符: int code = isSuccessfully? 200: 400; 很多人抱怨 Kotlin 为什么没有这个运算符。。。...对应 Kotlin,main 函数的写法如下: class KotlinMain{ companion object{ @JvmStatic fun main(...args: Array) { } } } Kotlin 可以包级函数,因此我们并不需要声明一个类来包装 main 函数: fun main(args: Array...如何实例化类 Java 和 C++ 这样的语言,在构造对象的时候经常需要用到 new 这个关键字,比如: Date date = new Date(); Kotlin 构造对象时,不需要 new

    1.6K20

    号称取代 Java 的 Kotlin 语言到底是什么鬼?

    null : text; } } 假如你想调用 format(String)。应该使用哪种类型来获得这个 Java 方法的结果呢?你三个选择。...事实上,这个类并不是匿名的,它的名字是 Companion,但你可以省略这个名字。看到了吗?这很简单。" 我很欣赏对象声明的概念——单例很有用。但从语言中删除静态成员是不切实际的。...class AppRunner { companion object { @JvmStatic fun main(args: Array) {...class AppRunner { companion object { @JvmStatic fun main(args: Array) {...这就是为什么 Kotlin 不允许数据类继承的原因。 我不知道你为什么提出这个问题。如果你需要更复杂的类,你仍然可以创建它们并手动维护它们的 equals、hashCode 等方法。

    2.2K50

    编写 Android Library 的最佳实践

    接你的库已经够累了,为什么还要人家仔细看你的命名呢?...伴生对象里需要暴露的 api 请打上 @JvmStatic 已经在写 Kotlin 的小伙伴应该都清楚,Kotlin 的“静态方法”、“静态常量”是靠“伴生对象”来实现的。...但是如果在 Java 里,就必须使用编译器自动帮我们生成的 Companion 类,变成 DemoPlatform.Companion.sayHello()。...这对于不熟悉 Kotlin 的 Java 程序员来说是很不友好的,尽管 IDE 的提示可能会让他们自己最终摸索出这个方法,但是面对不熟悉的 Companion仍然会一脸懵。...当然了,这个世界上没有完美的事物,目前我们的联运 SDK 仍然许多方面的不足,比如: 没有发布到 mavenCentral(),需要开发者手动下载 aar 并添加进编译 SDK 需要依赖 Picasso

    1.2K01
    领券