为什么 Kotlin 接口“未开放”?

问题描述

在 Kotlin 1.4.30 中,当我输入时

<Autocomplete
      options={ufList}
      getoptionLabel={(option) => option.label}
      style={{ width: 200,marginLeft: 10 }}
      onChange={changeValue}
      getoptionSelected={(option) => option.value === value}
      className={clsx(classes.TextField,classes.dense)}
      // value={value}
      autoHighlight
      autoSelect
      renderInput={(params) => (
        <TextField
          {...params}
          {...importedProps}
          error={Boolean(errorMessage)}
          helperText={errorMessage}
          label="UF"
          value={value}
          margin="dense"
          variant="outlined"
        />
      )}
    />

Kotlin 编译器警告我 open interface I 。这完全有道理:当然接口是开放的,否则它们将毫无用处。

然而,反射库似乎与此矛盾:

modifier 'open' is redundant for 'interface'

这有什么意义? KDoc of isOpen 非常简短:

interface I println(I::class.isOpen) // prints 'false' 如果这个类是开放的。

Kotlin 中“开放”的确切定义是什么? 我认为它的意思是“对被这个文件之外的类进行子类型化的可能性持开放态度”。

解决方法

方法 isFinalisOpenisAbstractisSealed 被设计为对于所有 KClass 实例只有其中一个返回 true。

来源:this comment in KT-19850

由于接口是抽象的,I::class.isAbstract == true。结合上述设计目标,I::class.isOpen == false 结果。

请为 KT-19850 点赞,以帮助解决这种令人惊讶的行为。