如果我有一个Kotlin函数
fun f(cb: (Int) -> Unit)
我想从Java调用f
,我必须这样做:
f(i -> {
dosomething();
return Unit.INSTANCE;
});
看起来很难看。为什么我不能像f(i-
我对Kotlin使用这种方法
MyKotlinClass {
//Method to use in Java, but not restricted to use in Kotlin.
fun f(cb: Consumer<Int>) { //Java8 Consumer, or any custom with the same interface
int i = getYourInt()
cb.accept(i)
}
}
//Extension for Kotlin. It will be used in Kotlin.
fun MyKotlinClass.f(cb: (Int) -> Unit) {
f(Consumer { cb(it) })
}
Kotlin中的单位(Unit)与Java中的无效(void)基本相当,但是只有在JVM规则允许的情况下。
Kotlin中的功能类型由以下接口表示:
public interface Function1<in P1, out R> : Function<R> {
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}
当您声明时(Int)-
静态编程语言设计者决定放弃功能接口的重复,而是依赖编译器“魔法”。如果你在静态编程语言中声明一个lambda,你不必返回一个值,因为编译器会为你插入一个。
为了让您的生活更轻松,您可以编写一个helper方法来包装消费者
public class FunctionalUtils {
public static <T> Function1<T, Unit> fromConsumer(Consumer<T> callable) {
return t -> {
callable.accept(t);
return Unit.INSTANCE;
};
}
}
用法:
f(fromConsumer(integer -> doSomething()));
有趣的事实:静态编程语言编译器对Unit
的特殊处理是您可以编写如下代码的原因:
fun foo() {
return Unit
}
或
fun bar() = println("Hello World")
这两种方法在生成的字节码中都有返回类型val
,但编译器足够聪明,可以弄清楚这一点,并允许您使用返回语句/表达式。
问题内容: 如果我有Kotlin功能 我想从Java 打电话,我必须这样做: 看起来很丑 由于Kotlin 中的Java 等同于Java ,为什么我不能这样写呢? 问题答案: Kotlin 中的Java 在大多数情况下与Java中的等效,但是仅在JVM规则允许的情况下才如此。 Kotlin中的功能类型由以下接口表示: 在声明时,从Java的角度来看,这等效于。这就是为什么您必须返回一个值。要变通解
以下是presenter中调用的方法: 下面是我的测试方法: 在Super.UpdateViewModel(vm)的处理程序中,我调用“SharedPreferenceHandler.MinStance.AccessToken!!)” 在我的测试方法中有可能得到这一点吗?
根据文档,newInstance()返回一个T:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance() 所以,如果我有一个返回T的方法,为什么我必须强制转换构造函数的返回。newInstance()到T?
我使用textutils.join连接一个字符串列表,但它返回null。我是在一个简单的单元测试中这样做的。 下面是有问题的代码:
问题内容: 以下(逻辑上)是编译时错误: 到目前为止,一切都很好。我不明白的是,以下内容是允许的: 为什么?认识到这对于编译器应该很简单,还是我在这里错过了一些关键点? (当然,如果在三元运算符中,一个以“空分支”结尾,那么它是一个NPE,还有什么?:) 问题答案: 三元条件运算符的类型由其第二和第三操作数的类型确定。 如果是 类型是,可以同时分配和。 编译器允许您的方法返回,因为它可以自动拆箱为