Iのkotlinでのアプリケーションでの作業が、良いJavaのサポートを持っている必要があります。私が見つけた問題はkotlinの機能です。
これは私が行うために使用するものです
fun test(loader: (String) -> Int)
彼らはこれを使用することができるようにkotlinライブラリをダウンロードする必要があるため、これはkotlinライブラリから関数1にコンパイルされますと、私が直接ので、瓶のサイズの瓶に含まkotlinライブラリを持っていないので、Java開発者のために難しくします方法。
私は、javaからサプライヤーや関数インタフェースを使用しようとしたが、あなたはそれが苦痛だ一緒に、一般的な引数を持つ多くの、より多くの変数の型とヌルチェックを提供しなければならないとので、私はkotlin開発者のためのより多くの困難なことを発見しました。..
また、同じように私自身のインターフェイスを作成してみました
@FunctionalInterface
interface Function<in T, out R>: Function<R> {
operator fun invoke(p: T): R
}
そして、機能
fun test(loader: Function<String, Int>)
それは、デフォルトのJava関数インタフェースと同じです
仕事ができる唯一の方法は、コンパイラが代わりにkotlinの1の私自身の機能のインターフェイスに私の元の関数をコンパイルできるようにすることですので。しかし、私はそれを行うにはどのようなアイデアを持っていません。
あなたがしている面しが見る、SAM変換を欠けによるものであるという問題点[1] 、[2]の詳細情報について。要するに、Javaは1デフォルト以外の、機能インタフェースなどの非静的メソッドで御馳走インターフェイスにことができます。この変換は、Kotlinに存在した場合、Kotlinラムダ式は暗黙などのJava機能インタフェースに変換することができますFunction<T, R>
。
これは、コンパイラを変更することなく、独自の機能のインターフェイスに機能リテラルをコンパイルすることはできません。
現状与えられた最善の策は、Kotlinで非常にコンパクトに行うことができ、いくつかの変換関数を、書くことです。
object Functional
{
@JvmStatic fun <T> toKotlin(supplier: Supplier<T>): () -> T = supplier::get
@JvmStatic fun <T, R> toKotlin(function: Function<T, R>): (T) -> R = function::apply
@JvmStatic fun <T> toKotlin(function: BinaryOperator<T>): (T, T) -> T = function::apply
@JvmStatic fun <T> toKotlin(consumer: Consumer<T>): (T) -> Unit = consumer::accept
...
}
のは、ファイルExample.ktにこれを適用してみましょう:
// passes an argument to the function and returns the result
fun call(function: (Int) -> Int, arg: Int): Int = function(arg)
次のようにJavaから、あなたはそれらを使用することができます。
import static yourpackage.Functional.toKotlin;
// in code:
ExampleKt.call(toKotlin(x -> 3 * x), 42);
利便性があなたの目標であればもちろん、あなたは両方KotlinとJavaの方法をサポートするために、関数のパラメータを取るあなたのメソッドをオーバーロードすることができます。
// Kotlin:
fun call(function: (Int) -> Int, arg: Int): Int = function(arg)
fun call(function: Function<Int, Int>, arg: Int): Int = call(toKotlin(function), arg)
// Java:
ExampleKt.call(x -> 3 * x, 42);