我想将我的一些代码重写为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)})
中的fun isAuthed()
行。
您是否知道该如何解决?
答案 0 :(得分: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教程。