Вы можете достичь желаемого (преобразование SAM) с помощью следующего синтаксиса:
enum class Operation private constructor(private val symbol: String, private val op: DoubleBinaryOperator) {
PLUS("+", DoubleBinaryOperator { left, right -> left + right }),
...
}
Обратите внимание, что это работает только для реализации интерфейсов Java, как описано здесь .
EDIT
Чтобы расширить мой комментарий ниже, вместо функциональных интерфейсов можно использовать лямбды Kotlin (так называемое преобразование SAM) только при вызове кода Java из Kotlin. Это не разрешено в чистом Kotlin, так как вы можете использовать типы функций (например, (Double, Double) -> Double
, для имитации DoubleBinaryOperator
).
В качестве примера рассмотрим следующий класс Java:
public class MyClass {
String append(String input, Supplier<String> supplier) {
return input.concat(supplier.get());
}
}
В Kotlin вы можете использовать его так:
val myClass = MyClass()
// Use case 1
myClass.append("something") {
"suffix"
}
// Use case 2
myClass.append("Something", Supplier { "suffix" })
Обратите внимание, что моя IDE говорит мне, что есть "избыточный SAM-конструктор" для варианта использования 2.
Теперь давайте перепишем MyClass
на Kotlin:
class MyClass {
fun append(input: String, supplier: Supplier<String>): String {
return input + supplier.get()
}
}
Если мы не изменим код, использующий его, мы получим ошибку компиляции для варианта использования 1: «Требуется поставщик, найдено () -> строка» (это та же проблема, что и у вас), поскольку преобразование SAM не может быть сделано Однако вы можете «форсировать» его, используя конструкторы SAM (то есть вариант использования 2).