为什么Kotlin接口是“;“未打开”吗;?

为什么Kotlin接口是“;“未打开”吗;?,kotlin,reflection,kotlin-reflect,Kotlin,Reflection,Kotlin Reflect,在Kotlin 1.4.30中,当我键入 open interface I Kotlin编译器警告我,修饰符“open”对于“interface”是多余的。。这是完全有道理的:当然,接口是开放的,否则它们将毫无用处 但是,反射库似乎与此相矛盾: interface I println(I::class.isOpen) // prints 'false' 这有什么意义?问题很简单: true如果该类已打开 Kotlin中“开放”的确切定义是什么? 我认为它的意思是“允许被此文件之外的类子类型化

在Kotlin 1.4.30中,当我键入

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

但是,反射库似乎与此相矛盾:

interface I
println(I::class.isOpen) // prints 'false'
这有什么意义?问题很简单:

true
如果该类已打开

Kotlin中“开放”的确切定义是什么?
我认为它的意思是“允许被此文件之外的类子类型化的可能性”。

方法
是final
是isOpen
是isastract
是密封的
的设计使得所有
KClass
实例中只有一个返回true。

来源:

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


请支持帮助这个奇怪的行为固定。

界面是抽象的,但不开放是有意义的,当你考虑它意味着什么。你可以实例化开放类,而抽象类是不可能的。@Pawel我不相信你的解释:如果“开放”隐含的“可以实例化”,我希望
openinterface
抛出一个编译器错误。相反,我得到一个警告,告诉我“你不需要编写
open
,这已经被
接口
暗示了。”@Pawel同样,
密封类
isastract==false
,即使它不能被实例化。是的,我理解抽象是open的超集。打开并不意味着“可实例化”。