Простой SAM требует преобразования в анонимный объект - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий простой интерфейс

interface A {
    fun move(s:Boolean): Int
}

У меня есть следующий класс

class X{
    fun draw (x: A): String{
        return "A"
    }

    fun main() {
      val temp = A {
          s -> 100
      }
      val a = draw ( { x -> 100} )
    }
}

Однако оба temp и a не могут быть объявлены. temp жалуется, и предлагаемое исправление заключается в преобразовании в анонимный объект следующим образом (что отрицает всю цель использования SAM?)

val temp = object : A {
        override fun move(s: Boolean): Int {
            return 100
        }
    }

a жалуется на несоответствие типов. Мой вопрос: почему этот простой SAM не работает? Подпись метода такая же.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Kotlin 1.4 поддерживает преобразования SAM для интерфейсов Kotlin, в дополнение к преобразованию SAM интерфейса Java, доступному в предыдущих версиях. См .:

С 1,4 вы нужно определить ваш интерфейс как «функциональный» интерфейс:

fun interface A {
    fun move(s:Boolean): Int
}
0 голосов
/ 14 апреля 2020

В настоящее время Kotlin имеет преобразование SAM только для интерфейсов, определенных в Java.
Для чистого кода Kotlin вы должны использовать такой тип функции, как:

typealias A = (s: Boolean) -> Int

Однако ожидаемый синтаксис будет поддерживаться в Kotlin 1.4 с интерфейсом, определенным как fun interface.
Как было объявлено здесь: Что ожидать в Kotlin 1.4 и далее
и отслеживаться как KT-7770

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...