Преобразование универсальной функции в Kotlin завершается неудачно - PullRequest
0 голосов
/ 14 октября 2018

Я бы хотел переписать часть своего кода на Kotlin.Сначала я вставил рабочий код, чтобы показать источник.
Я попытался

Ниже приведен рабочий отрывок, написанный на Java:

Function1.class (часть фреймворка):

public interface Function1<T1, R> {
    R call(T1 var1);
}

Authmanager.class:

public boolean isAuthed() {
    Boolean isAuthed = getWithAuthPolicyManager(
            authPolicyManager -> authPolicyManager.getBoolean(IS_AUTHED)
    );

    if (isAuthed != null) {
        return isAuthed;
    } else {
        return false;
    }
}

public <T> T getWithAuthPolicyManager(@NonNull Function1<AuthManager, T> function) {
    Objects.requireNonNull(function);
    synchronized (AUTH_POLICY_LOCK) {
        try {
            openAuthPolicyManager();
            return function.call(authPolicyManager);
        } catch (OpenFailureException | EncryptionError e) {
            LOGGER.error("Error:", e);
            return null;
        } finally {
            authPolicyManager.close();
        }
    }
}

Я хотел бы переписать его в Kotlin, но не могу:
Authmanager.kt

fun isAuthed(): Boolean {
    val isAuthed =
        getWithAuthPolicyManager<Boolean>({
            authPolicyManager -> authPolicyManager.getBoolean(IS_AUTHED) 
        })
    return isAuthed ?: false
}

fun <T> getWithAuthPolicyManager(function: Function1<AuthManager, T>) : T? {
    synchronized (AUTH_POLICY_LOCK) {
        return try {
            openAuthPolicyManager();
            return function.call(authPolicyManager);
        } catch (OpenFailureException | EncryptionError e) {
            LOGGER.error("Error", e);
            null;
        } finally {
            authPolicyManager.close();
            null
        }
    }
}

На самом деле, я просто скопировал Java-код в класс Kotlin для автоматического преобразования в Kotlin.Тем не менее, линтер говорит:

Type mismatch.  
Required: Function1<AuthManager, Boolean>  
Found:    (AuthManager) -> Boolean!

к этой строке getWithAuthPolicyManager<Boolean>({authPolicyManager -> authPolicyManager.getBoolean(IS_AUTHED)}) in fun isAuthed().

У вас есть идеи, как это можно исправить?

1 Ответ

0 голосов
/ 14 октября 2018

Ваша вторая функция вообще не конвертируется, это все еще код Java.Я использовал конвертер из try.kotlinlang.org и получил следующий код:

fun <T> getWithAuthPolicyManager(function : Function1<AuthManager, T>) : T? {
  synchronized (AUTH_POLICY_LOCK) {
    try
    {
      openAuthPolicyManager()
      return function.call(authPolicyManager)
    }
    catch (e : OpenFailureException) {
      LOGGER.error("Error", e)
      return null
    }
    catch (e : EncryptionError) {
      LOGGER.error("Error", e)
      return null
    }
    finally
    {
      authPolicyManager.close()
    }
  }
}

После легкой очистки он должен выглядеть следующим образом:

inline fun <T> getWithAuthPolicyManager(function : (AuthManager) -> T?) : T? {
  synchronized (AUTH_POLICY_LOCK) {
    return try
    {
      openAuthPolicyManager()
      function(authPolicyManager)
    }
    catch (e : OpenFailureException) {
      LOGGER.error("Error", e)
      null
    }
    catch (e : EncryptionError) {
      LOGGER.error("Error", e)
      null
    }
    finally
    {
      authPolicyManager.close()
    }
  }
}

Пожалуйста, посмотритев учебник Kotlin, если вы не можете отличить объявления функций Kotlin и Java.

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