为何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
相关产品推荐
相关产品推荐

