Generics 将泛型函数转换为Kotlin失败
我想把我的一些代码重写成Kotlin。我首先粘贴了工作代码以显示原点。 我试过了 以下是用Java编写的工作摘录: Function1.class是框架的一部分: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(
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?解决了这个问题!谢谢