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

为何Java类参数在Kotlin中被识别为非空而非平台类型?求示例

Java与Kotlin互操作:平台类型为何被识别为非空?

如果Java代码未给参数标记@Nullable或@NotNull,在Kotlin中这类参数会被称为平台类型——我们可以自由将其当作可空或非空类型使用,只需在参数类型末尾添加或省略问号即可。

比如我自己写的示例:

自定义类的正常互操作

Java类代码:

public class Main{
        public void hi(String[] string){
        }
}

对应的Kotlin子类重写:

class A: Main(){
        override fun hi(string: Array<String?>?){
                super.hi(null)
        }
}

这段代码可以正常编译,完全符合平台类型的预期行为。


但当我尝试重写Android SDK中ExoPlayer的DefaultLoadControl类方法时,却遇到了问题:

ExoPlayer方法重写的异常情况

Java原方法定义:

@UnstableApi
public class DefaultLoadControl implements LoadControl {
...
  @Override
  public void onTracksSelected(
      Timeline timeline,
      MediaPeriodId mediaPeriodId,
      Renderer[] renderers,
      TrackGroupArray trackGroups,
      ExoTrackSelection[] trackSelections) {
    targetBufferBytes =
        targetBufferBytesOverwrite == C.LENGTH_UNSET
            ? calculateTargetBufferBytes(renderers, trackSelections)
            : targetBufferBytesOverwrite;
    allocator.setTargetBufferSize(targetBufferBytes);
  }
...
}

我按照平台类型的逻辑编写了Kotlin重写代码:

@UnstableApi
class OwnLoadControl:DefaultLoadControl() {
    override fun onTracksSelected(
        timeline: Timeline,
        mediaPeriodId: MediaSource.MediaPeriodId,
        renderers: Array<out Renderer>,
        trackGroups: TrackGroupArray,
        trackSelections: Array<ExoTrackSelection?>?
    ) {
        super.onTracksSelected(timeline, mediaPeriodId, renderers, trackGroups, null)
    }
}

结果编译报错,提示trackSelections参数被视为非空类型,不能传入null。明明是Java类的参数,却没有被当作平台类型处理,这是为什么?


更新:关于空性定义的疑问

看到评论提到:空性注解并非Kotlin互操作中标记空性的唯一方式,还可以在单独文件中定义。

希望有人能提供一个这种定义方式的示例。


内容的提问来源于stack exchange,提问作者VanechikSpace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:32:57