问题描述
在 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 中“开放”的确切定义是什么? 我认为它的意思是“对被这个文件之外的类进行子类型化的可能性持开放态度”。
解决方法
方法 isFinal
、isOpen
、isAbstract
、isSealed
被设计为对于所有 KClass
实例只有其中一个返回 true。
由于接口是抽象的,I::class.isAbstract == true
。结合上述设计目标,I::class.isOpen == false
结果。
请为 KT-19850 点赞,以帮助解决这种令人惊讶的行为。