0

我想将我的一些代码重写为 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。但是,linter 说:

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

到这一getWithAuthPolicyManager<Boolean>({authPolicyManager -> authPolicyManager.getBoolean(IS_AUTHED)})fun isAuthed()

你知道如何解决这个问题吗?

4

1 回答 1

1

您的第二个函数根本没有转换,它仍然是 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 和 Java 函数声明,请查看 Kotlin 教程。

于 2018-10-14T13:18:46.450 回答