Generics 将泛型函数转换为Kotlin失败

Generics 将泛型函数转换为Kotlin失败,generics,lambda,kotlin,Generics,Lambda,Kotlin,我想把我的一些代码重写成Kotlin。我首先粘贴了工作代码以显示原点。 我试过了 以下是用Java编写的工作摘录: Function1.class是框架的一部分: public interface Function1<T1, R> { R call(T1 var1); } Authmanager.class: public boolean isAuthed() { Boolean isAuthed = getWithAuthPolicyManager(

我想把我的一些代码重写成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{authPolicyManager->authPolicyManager.getBooleanIS_AUTHED}在fun中是经过授权的


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

你的第二个函数根本没有转换,它仍然是Java代码。我使用了来自的转换器,得到了以下代码:

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调用,因此我无法将其设置为内联函数,所以是否将函数:Function1更改为function:AuthManager->T?解决了这个问题!谢谢