Kotlin内联值类与Java互操作:装箱强制及问题咨询
Kotlin内联值类与Java互操作的问题与探索
尝试与发现
- 可在Java中直接导入内联值类(如
import kotlin.Result) - 无法在Java中调用其构造方法(如
Result.success) - 无法在Java中调用已构造实例的方法(如
myResult.isSuccess)
我编写了一些兼容方案,但存在边缘情况与异常,现提出以下技术问题:
技术问题
- 装箱是保留类型信息的必要操作,除了使用
?(会触发不必要的空检查)外,是否有其他强制装箱的方式?我尝试的泛型方法编译通过但运行时抛出java.lang.NoSuchMethodError。 - 是否有其他实现方案或辅助Kotlin-Java内联值类互操作的库?
- 未显式装箱时,Java调用
isFailure会丢失成功/失败状态,这是否为Bug,求相关分析。
兼容Kotlin代码
@file:JvmName("Inline") package play // 注:不加`?`无法编译: // 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) // 注:Java中不加`?`能编译,但"失败"实例会返回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")); // 注:除非isFailure方法使用`?`类型,否则此处断言失败 assertTrue(Inline.isFailure(fail)); } // 仅用于证明可以将Result实例传递给Java方法 <T>void assertSuccess(Result<T> r) { assertTrue(Inline.isSuccess(r)); } }
内容的提问来源于stack exchange,提问作者vitiral
相关产品推荐
相关产品推荐

