@JvmStatic
被标记的函数、变量将编译为Java中的类静态成员变量,不需要通过伴随对象Companion引用:
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
// In Java:
C.foo(); // works fine
C.bar(); // error: not a static method
C.Companion.foo(); // instance method remains
C.Companion.bar(); // the only way it works
object Obj {
@JvmStatic fun foo() {}
fun bar() {}
}
// In Java:
Obj.foo(); // works fine
Obj.bar(); // error
Obj.INSTANCE.bar(); // works, a call through the singleton instance
Obj.INSTANCE.foo(); // works too
@Synchronized
和Java中给类加上Synchronized修饰符一样,实现线程安全。
@Volatile
和Java的Volatile修饰符作用一样。
@JvmOverloads
在有默认参数值的方法中使用@JvmOverloads
注解,则Kotlin就会暴露多个重载方法。
由于默认参数值在Java调用中不起作用:
fun f(a: String, b: Int = 0, c: String="abc"){
...
}
相当于在Java中声明
void f(String a, int b, String c){
}
在使用@JvmOverloads
注解后:
@JvmOverloads fun f(a: String, b: Int=0, c:String="abc") { ... }
相当于在Java中声明了3个方法:
void f(String a)
void f(String a, int b)
void f(String a, int b, String c)
注:该注解也可用在构造方法和静态方法。
class MyLayout: RelativeLayout {
@JvmOverloads
constructor(context:Context, attributeSet: AttributeSet? = null, defStyleAttr: Int = 0)
: super(context, attributeSet, defStyleAttr)
}
※ 尤其在重写View的时候,需要声明为
class xxx @JvmOverloads constructor()
网友评论