- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想打印我的类(class)的属性值。
fun print() {
val cl = this::class
cl.declaredMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach {
println("${it.name} = ${it.get(this)}")
}
}
当我尝试构建此代码时,出现编译器错误:
Error:(34, 40) Kotlin: Out-projected type 'KProperty1<out SomeClass, Any?>' prohibits the use of 'public abstract fun get(receiver: T): R defined in kotlin.reflect.KProperty1'
当我更改 this
到类(class)名称SomeClass
一切都很好
fun print() {
val cl = SomeClass::class
cl.declaredMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach {
println("${it.name} = ${it.get(this)}")
}
}
所以问题是编译器更改类型为 this::class
至KClass<out SomeClass>
而不是使用KClass<SomeClass>
.知道为什么会这样吗?
最佳答案
造成这种差异的原因是,当您使用 SomeClass::class
引用,肯定是代表SomeClass
的class token而不是它可能的派生类之一,因此它是 KClass<SomeClass>
没有类型投影。
但是this::class
写在 open
的函数中或 abstract
类或扩展函数可以返回派生类的类标记,因此,为确保类型安全,type is out
-projected : KClass<out SomeClass>
表示实际类型参数可以是SomeClass
或其子类型。
例子:
open class A {
fun f() {
println(this::class) // KClass<out A> because it can be KClass<B>
}
}
class B : A()
B().f()
关于reflection - 为什么 SomeClass::class 是 KClass<SomeClass> 但 this::class 是 KClass<out SomeClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069979/
我正在尝试实现checked Stack基于 Kotlin 中的 java 数组。但是我在将 KClass 与我的通用参数类型一起使用时遇到问题 允许空值。 Java Generic types ar
我想打印我的类(class)的属性值。 fun print() { val cl = this::class cl.declaredMemberProperties.filter {i
码 import kotlin.reflect.full.* class FooBar(val bar: String) fun FooBar.baz(): Unit {println(this.ba
我编写了以下代码来获得 Array 的 KClass . Array::class 但是,这段代码有编译错误。 Kotlin: Array class literal requires a type
我正在尝试构建一个外部模块可以注册的同步类,但我无法使泛型部分工作。 外部模块将注册 SynchronizationBundle在 Synchronizator ,然后应该处理同步。 interfac
在 Kotlin 中,当声明获取类型的 KClass 时,例如 String::class(表示类型将为 String 的值),是否有语法来指示该值可为空(即表示 String? values 而不是
如果我有一个类似 "mypackage.MyClass" 的字符串,如何在运行时(从 JVM)获取对应的 KClass? 最佳答案 您可以使用Java 的方法获取Class 实例Class.forNa
我有一个 Kotlin 类,其主要(也是唯一的)构造函数为空。 我有这个类的引用: val kClass: KClass = MyClass::class 如何使用反射创建此类的实例? 在 Java
KClass定义为 public interface KClass : KDeclarationContainer, KAnnotatedElement, KClassifier 这很棘手,因为类 S
我需要访问通用扩展函数内的类类型。例如,如果我想创建一个扩展函数来返回我正在扩展的类型的成员集合,我会这样做: fun T.getMembers() = this::class.mem
我有以下注释: @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.SOURCE) @MustBeDocumented ann
如何使用Kotlinpoet生成下面的代码行? val myMap:Map> 我在初始化块中初始化myMap。 最佳答案 Map::class.asClassName() .parameter
在 java 中,当我有一个 Class<> 实例时,我有返回 Method 的 getMethod,它非常易于使用。 正如我所见,Kotlin 让生活变得更加艰难,因为这种方法不存在。除了将 KCl
我有功能的定义 abstract class AbstractDao(private val dataStore: KotlinEntityDataStore): Dao where T: Persi
在下面的代码中,我无法正确安排输入/输出以使 from() 和 to() 都按预期工作。我试过在属性和函数参数中切换进/出,但总是以不正确的输入错误告终。 class KStateMachine(pr
在 Java 中,我们可以通过 getClass() 解析变量的类,例如 something.getClass()。在 Kotlin 中,我知道 something.javaClass 很好,但我希望
我正在使用 Kotlins KClass 按名称查找类,如下所示: val i: KClass = Class.forName("SampleClass").kotlin 但是,我想省略接口(inte
我试图实现一个简单的自动迁移,它只是将一个可为空的字符串字段添加到我唯一的表中,但由于某种原因,我在 autoMigrations = [AutoMigration(from = 1, to = 2)
假设我们有通用函数: fun foo(o: T) { o::class } o::class的类型是 KClass .为什么有出方差注释,为什么没有KClass (因为 T 的删除是 Any
我正在尝试以下 "simple string"::class.isInstance(kotlin.String) 但是它返回假! I'm using "org.jetbrains.kotlin:kot
我是一名优秀的程序员,十分优秀!