4

我想用具体化类型作为扩展函数的功能,但我不认为这是可能的,因为在我检查生成的字节码后,我发现方法签名是私人的,任何解决方法使它公开?Kotlin作为函数扩展的函数类型函数 - 可从Java调用?

CommonExtensions.kt

inline fun<reified T: Activity> Context.startActivity() { 
    val intent = Intent(this, T:: class.java) 
    startActivity(intent) 
} 

fun View.visible() { 
    visibility = View.VISIBLE 
} 

科特林字节码:

private final static startActivity(Landroid/content/Context;)V 
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0 
    ... 

客户端代码:

科特林文件

override fun showMessageEmptyOfferFeeds() { 
     mOfferFeedsWarning.visible() // "visible()" extension func RESOLVED 
} 

的Java文件

showProfileDetailsUi(){ 
    startActivity<DetailActivity>() //"startActivity()" extension func NOT RESOLVED 
} 

回答

3

是的,你可以使用inline功能reified类型作为扩展功能。这是private,以便Java代码不能访问它(顺便说一句,“正常”inline功能不是这种情况)。 这种inline函数可以是private科特林因为内联函数复制的地方其中它们调用

example

inline fun <reified T : Activity> Activity.startActivity() { 
    startActivity(Intent(this, T::class.java)) 
} 

//usage 

startActivity<DetailActivity>() 

了解更多关于reified在另一个SO问题,我回答:https://stackoverflow.com/a/45952201/8073652

再次:不能使用inline功能与reified从Java类型。

+0

是的,它只是一个类的级别..但我不能用它在其中定义的文件的一面..我的问题是如何使用它作为正常的扩展功能? – Abdellah

+0

尝试将其定义为最高级别。这是类似Extensions.kt的类,它可能只包含你的功能,没有围绕它的类 – s1m0nw1

+0

我做了但不工作 – Abdellah

2

inline reified功能 'disppear' 编译后,因为具体化的类型不JVM上的存在。这是编译器的一个窍门。

也许唯一的原因是私有函数在那里有一个错误,如果有人试图在运行时覆盖它,因为reified函数是完全内联的并且不能被覆盖。

+2

嗨,它并没有消失。它只是使隐藏的可见性,以避免Java代码调用它。 –