You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin内联值类与Java互操作:装箱强制及问题咨询

Kotlin内联值类与Java互操作的问题与探索

尝试与发现

  • 可在Java中直接导入内联值类(如import kotlin.Result)
  • 无法在Java中调用其构造方法(如Result.success)
  • 无法在Java中调用已构造实例的方法(如myResult.isSuccess)

我编写了一些兼容方案,但存在边缘情况与异常,现提出以下技术问题:

技术问题

  1. 装箱是保留类型信息的必要操作,除了使用?(会触发不必要的空检查)外,是否有其他强制装箱的方式?我尝试的泛型方法编译通过但运行时抛出java.lang.NoSuchMethodError。
  2. 是否有其他实现方案或辅助Kotlin-Java内联值类互操作的库?
  3. 未显式装箱时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:43:37