我想更好地理解与内联值类相关的Java/Kotlin互操作.下面是我try 互操作的一些示例代码,下面是一些注释:
-
can直接导入Java中的内联值类,即
import kotlin.Result
-
cannot在Java中使用它们的构造函数方法,即
Result.success
- 一旦在Java中构建,您cannot就可以使用它们的方法,即
myResult.isSuccess
我在下面创建了一些解决方法.它们起作用...但似乎也有自己的锋芒-- case 和怪事.我有几个问题:
-
"装箱"似乎是保存类型信息所必需的.是一种强制执行
?
以外的装箱的方法(其缺点是会触发不必要的空判断).我try 了类似fun <T, R: Result<T>> success(value: T): R = Result.success(value as T) as R
的代码--它已编译,但在运行时抛出了java.lang.NoSuchMethodError
错误(!!) -
有没有其他方法可以做到这一点?有没有什么模块/库可以帮助实现Kotlin/Java内联值互操作?
-
这里的Java<;->;kotlin互操作在从Java调用时导致
isFailure
个方法失go 成功/失败状态(没有显式的?
装箱),这似乎是一个错误,但我将不胜感激!
装箱定义为here,从中我可以看到您可以通过使用泛型和接口来装箱,但我不知道如何使用它们来强制装箱并执行逻辑和类型判断.
Kotlin :
@file:JvmName("Inline")
package play
// Note: doesn't compile without `?`:
// incompatible types: no instance(s) of type variable(s) T exist so that
// Object conforms to Result<String>
@JvmName("success") fun <T> success(value: T): Result<T>?
= Result.success(value)
@JvmName("failure") fun <T> failure(t: Throwable): Result<T>?
= Result.failure(t)
// Note: java compiles without `?` BUT "failures" report isSuccess=true (!?!)
@JvmName("isSuccess") fun <T> isSuccess(r: Result<T>?): Boolean
= r!!.isSuccess
@JvmName("isFailure") fun <T> isFailure(r: Result<T>?): Boolean
= r!!.isFailure
Java测试代码:
package play;
import static org.junit.Assert.assertTrue;
import kotlin.Result;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class InlineTest {
@Test
public void testResult() {
Result<String> rString = Inline.success("hi");
assertTrue(Inline.isSuccess(rString));
assertSuccess(rString);
Result<Integer> rInt = Inline.success(42);
assertTrue(Inline.isSuccess(rInt));
Result<Throwable> fail = Inline.failure(new Exception("test"));
// Note: fails unless isFailure using `?` type
assertTrue(Inline.isFailure(fail));
}
// just proves you can pass them to java functions
<T>void assertSuccess(Result<T> r) {
assertTrue(Inline.isSuccess(r));
}
}