【问题标题】:Converting a generic function to Kotlin fails将泛型函数转换为 Kotlin 失败
【发布时间】:2018-10-14 12:56:26
【问题描述】:

我想将我的一些代码重写为 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&lt;Boolean&gt;({authPolicyManager -&gt; authPolicyManager.getBoolean(IS_AUTHED)})这一行fun isAuthed()

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

【问题讨论】:

    标签: generics lambda kotlin


    【解决方案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 教程。

    【讨论】:

    • 过失,我错误地将第二个 Kotlin 函数复制粘贴到这里。无论如何,感谢您花时间在上面!但是,问题仍然存在。你有什么主意吗 ? (getWithAuthPolicyManager() 中的函数调用包含非公共 API 调用,因此我不能将其设为内联函数)
    • 还将function : Function1&lt;AuthManager, T&gt; 更改为function : (AuthManager) -&gt; T? 解决了问题!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多