Tag:

如何将实例类型数据存储在Kotlin的实例字段中?

我目前正在写一个库的DSL,我想提供使用像这样的具体类型参数的类型元数据: val config = Config.create() .consumerFor<MyType>{ // consume } 我的问题是,我只能reified inline函数中使用reified关键字,而reified inline函数中我不能使用像这样的实例字段: inline fun <reified T> consumerFor(consumer: (T) -> Unit) { consumers.put(T::class.java, consumer) return this } 因为我得到一个错误: 公共API内联函数不能访问非公共API的私有最终val消费者… 看来到目前为止,我不能在最有用的地方使用实体类型参数。 有没有解决方法?

筛选泛型类型而不反映或投射

在Kotlin有一个有限的形式化的泛型 。 有没有什么办法可以使用实体过滤泛型类型,而不使用getClass()或as或任何一种怪异的注释,即。 只是通过使用is关键字? 例如,我有以下结构: import java.util.* internal class Layout<out T : LayoutProtocol>(val t: T) { fun getName(): String { return t.getName() } } interface LayoutProtocol { fun getName(): String } internal class Vertical : LayoutProtocol { override fun getName(): String { return "Vertical" } } internal class Horizontal : LayoutProtocol { override fun getName(): […]

Kotlin泛型Array <T>导致“不能使用T作为一个实体类型参数。 用类来代替“但是List <T>不是

我有一个接口,包含T和一些元数据的数组(或列表)。 interface DataWithMetadata<T> { val someMetadata: Int fun getData(): Array<T> } 如果我编写接口的最简单的实现,我得到emptyArray()上的编译错误:“不能使用T作为一个实际的类型参数,而是使用一个类。” class ArrayWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> { private var myData: Array<T> = emptyArray() override fun getData(): Array<T> { return myData } fun addData(moreData: Array<T>) { this.myData += moreData } } 但是,如果我将接口和实现更改为列表,我没有编译时问题: interface DataWithMetadata<T> { val someMetadata: Int fun getData(): List<T> } class ListWithMetadata<T>(override […]

我如何用Java的泛化泛型调用Kotlin方法?

我在Kotlin中有以下方法: inline fun <reified T> foo() { } 如果我试图从Java调用这样的: myObject.foo(); 或者像这样: myObject.<SomeClass>foo(); 我得到以下错误: java:foo()在MyClass中有私人访问 我怎样才能从Java调用foo方法?

Kotlin实体类型参数不智能投射

我正在试验设置未初始化的值,并试图让以下工作。 这主要是对物化仿制的权力(和限制)的好奇心。 我试图为数据类的可选参数提供默认值。 inline fun <reified T> uninitialized(): T = when (T::class) { Long::class -> -1L // Type mismatch. Required: T Found: Long String::class -> "" // Type mismatch. Required: T Found: String // and so on… else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class) } data class Thing( var id: Long […]