В вашем случае было бы проще иметь интерфейс в Java:
fun createFoo() : Foo = Foo { "hello $it" }
Но поскольку у вас вместо этого есть интерфейс Kotlin, вам немного не повезло. Вот связанная с этим проблема, связанная с этим: KT-7770
Обходной путь к этому может быть (но это в основном зависит от того, как вы используете этот интерфейс), чтобы иметь интерфейс Kotlin следующим образом. это основная точка входа для стороны Java:
interface Foo : (String) -> String
На стороне Kotlin вы не будете использовать ее, а сторона Java должна использовать ее только для доставки функций, например
// Java class
public class JFooFactory implements FooFactory {
@Override
@NotNull
public Foo createFoo() { // uses the Foo-interface from Kotlin
return input -> "hello " + input;
}
}
// Kotlin equivalent:
class KFactory : FooFactory {
override fun createFoo() : (String) -> String = {
"hello $it"
}
}
где соответствующий FooFactory
-интерфейс может выглядеть следующим образом:
interface FooFactory {
fun createFoo() : (String) -> String
}
Использование может выглядеть следующим образом:
listOf(KFooFactory(), JFooFactory())
.map {
it.createFoo()
}
.forEach { func : (String) -> String -> // i.e. func is of (sub)type (String) -> String
func("demo") // calling it to deliver "hello demo" twice
}
В качестве альтернативы, чтобы также иметь это Foo
-чувство для Kotlin васможет сделать это следующим образом:
typealias Foo = (String) -> String
interface JFoo : Foo
// or if you put the interface in its own package you could also use:
interface Foo : someother.package.Foo
, тогда код Java останется таким же, как указано выше, либо с JFoo
или с Foo
, указывающим на этот другой пакет;typealias не виден из Java. Сторона Kotlin изменится на следующее:
class KFactory : FooFactory {
override fun createFoo() : Foo = {
"hello $it"
}
}
Интерфейс Factory
также можно заменить:
interface FooFactory {
fun createFoo() : Foo
}
Под капотом, однако, все остается прежним. У нас есть / 10 * * в Kotlin и Foo
-функциональный интерфейс в Java.