gpt4 book ai didi

java - 在java代码中定义Kotlin扩展函数

转载 作者:行者123 更新时间:2023-12-02 12:47:09 27 4
gpt4 key购买 nike

我想为字符串提供一个 Kotlin 扩展函数,该函数只能在 MyParent 的继承者中访问类( protected 功能)。 MyParent类是用 java 编写的,不能转换为 Kotlin。是否可以在 Java 代码中定义一个可用作 Kotlin 代码中的扩展函数的方法?

我想我期待某种适当的签名,或者一些神奇的 @ThisIsExtenstionFunction 注释。

最佳答案

事实上,你可以。非开箱即用,但有可能;)

让我们考虑这个例子。

一、创建类MyParent在 java

public class MyParent {
}

并且,在这个接口(interface)中定义扩展方法:
interface MyParentExt {
fun String.ext(importantParam: Int)
}

所以,让 MyParent实现这个接口(interface)。
public class MyParent implements MyParentExt {

@NonNull
@Override
public String ext(@NonNull String $receiver, int importantParam) {
// do cool stuff
return $receiver;
}

// For testing let's add other public method:
public String ext(int importantParam) {
return "Kotlin > Java";
}

}

所以,让我们检查一下我们可以在 child 身上做什么:
// Java child:
public class MyJavaChild extends MyParent {
MyJavaChild() {
"Java xD".ext(0); // Invalid! There is no such a method!
ext("Java xD", 0); // Valid call for extension function
ext(0); // Just Valid ;)
}
}

// Kotlin class:
class MyGreatKotlinChild : MyParent() {
init {
"Kotlin is cool".ext(0) // Valid extension function!
ext("Kotlin is cool", 0) // Invalid call. There is no method with such a signature!
ext(0) // Valid.
}
}

因此,我们可以使用语言指定的符号在 Java 和 Kotlin 中访问我们的扩展方法。

作为您的要求之一,您希望此方法受到保护。
不幸的是,接口(interface)方法的可见性总是公开的。因此,您仍然应该能够在成员上调用此函数。

但是......让我们检查一下它是如何工作的;)
// Java
public class Test {
public static void main(String[] args) {
MyChild child = new MyChild();

// Both methods are valid
child.ext("Java...", 0);
child.ext(0);
}
}

// Kotlin
fun main() {
child.ext(0) // Normal function, valid call.
child.ext("It actually works...", 0) // Hah, no way ;)

// Just to be sure:
"String".ext(0) // Nope, this ext method is visible for only class scope.
}


此外,您的父类可以扩展 ParentOfMyParent您将在其中定义扩展方法的类:
// Kotlin
abstract class ParentOfMyParent {
protected abstract fun String.ext()
}

// Java
public class Parent extends ParentOfMyParent {
@Override
protected void ext(@NotNull String $receiver) {
}
}

// Kotlin-child
class Child : Parent() {
init {
"".ext()
}
}

// Java-child
public class ChildJava extends Parent {
ChildJava() {
ext("");
}
}

这种方式方法具有所需的可见性。

关于java - 在java代码中定义Kotlin扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56987823/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com