Tag: 泛型

Kotlin:泛型方法和for循环询问iterator()

这是一个简单的泛型方法,并且传递for循环中的参数值会导致错误: for-loop范围必须有和iterator()方法 fun main(args: Array<String>) { val arr: IntArray = intArrayOf(1,2,3,4) val charA: CharArray = charArrayOf('a','b','c','d') printMe(arr) printMe(charA) } fun <T>printMe(args: T){ for (items in args){ println(items) } } 我如何使它迭代char[]和array

如何在kotlin中编写含泛型的lambdas?

我可以使用显式类型编写lambdas id_Int和id_Boolean 。 我可以用类型参数编写函数identity 。 我可以用类型参数写lambda吗? fun testFuncInt(f: (Int) -> Int): Int = f(1) + 2 val id_Int = { x: Int -> x } fun testFuncBoolean(f: (Boolean) -> Boolean): Boolean = !f(false) val id_Boolean = { x: Boolean -> x } fun <T> identity(x: T) = x fun main(args: Array<String>) { println(testFuncInt(id_Int)) println(testFuncInt(::identity)) println(testFuncBoolean(id_Boolean)) […]

KProperty1.getDelegate上的泛型限制太多?

我试图获得一个类层次结构中的某个类型的所有属性代表。 这给我提出了一些问题。 首先,在Kotlin看来,没有一种简单的方法可以获得班级的超类。 我尝试的第一种方法是使用Java的Class.getSuperclass : private fun <T : Any> KClass<T>.getSuperclass(): KClass<in T>? = (java.superclass as? Class<out Any>)?.kotlin as KClass<in T> 但是这需要一个未经检查的转换,因为Kotlin不允许我将Class<in T>转换回Kotlin,因为显然在T中意味着它可以是非Any的东西,不管可能是什么(“Type参数有一个上在'投影'中'任何'不能被满足'捕获')。 所以我尝试了一个纯粹的Kotlin解决方案:首先获取包括接口( KClass.superclasses )的所有超类,然后过滤出每个接口。 但是KClass上没有什么KClass告诉我它是否是一个接口! 所以我必须再次去Java。 而且它又需要一个未经检查的转换,因为由于某种原因, KClass.superclasses的类型是List<KClass<*>>而不是List<KClass<in T>> : private fun <T : Any> KClass<T>.getSuperclass123(): KClass<in T>? = superclasses.firstOrNull { it.java.isInterface } as KClass<in T>? 我在这里错过了什么? 我必须。 现在对于实际的问题,试图获得一个类层次结构中的所有属性委托实例。 首先我写了一个函数来获取一个类的实例: private fun <T […]

如何在Kotlin中使用Gson的TypeToken +泛型

我无法从自定义类(Turns)中获取泛型类型的列表: val turnsType = TypeToken<List<Turns>>() {}.type val turns = Gson().fromJson(pref.turns, turnsType) 它说: cannot access '<init>' it is 'public /*package*/' in 'TypeToken'

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 […]

Kotlin:编译器不会推断一些运算符的泛型类型

为什么Kotlin的编译器不能用一些运算符调用来推断泛型? 例如: class Example { operator inline fun <reified T : Any> unaryMinus(): T { … } } 在主要方法中使用它… fun main(args: Array<String>) { val ex = Example() val works: Boolean = ex.unaryMinus() val doesntWork: Boolean = -ex }

如何将一个整数数组传递给期望`Array <T>`的方法?

我已经将java shellSort转换为Kotlin。 问题是我不知道要调用这个方法。 Java的 package Sorts; public class ShellSort extends Sorter{ @Override public <T extends Comparable<? super T>> void sort(T[] a) { int h = 1; while((h*3+1) < a.length) h = 3*h+1; while(h > 0){ for(int i = h-1; i < a.length; i++){ T s = a[i]; int j = i; for(j = i; (j>=h) […]

Kotlin – 不能使用'T'作为实体类型参数。 改用班级

我有一个简单的帮助函数来从SharedPreferences中获取值,如下所示: operator inline fun <reified T : Any> SharedPreferences.get(key: String, defaultValue: T? = null): T? { return when (T::class) { String::class -> getString(key, defaultValue as? String) as T? Int::class -> getInt(key, defaultValue as? Int ?: -1) as T? Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T? Float::class -> getFloat(key, defaultValue as? Float ?: […]

Kotlin:泛型集合到泛型数组

如何从泛型集合中获得泛型数组 ? 我做了以下几件事: val genericArray: Array<E> = (genericCollection as java.util.Collection<E>).toArray() as Array<E> 这是正确的方式还是有一个更优雅的解决方案? 期待您的帮助! 编辑 我最终写了这个帮手扩展: fun <E> Collection<E>.toUntypedArray(): Array<E> { @Suppress("UNCHECKED_CAST") return arrayOf(size, this) as Array<E> } 有没有人有这个问题的更好的解决方案?

Kotlin:覆盖子类型中的泛型属性

我试图写一些通用的代码,但不能摆脱Type of 'PROPERTY' is not a subtype of the overridden property错误Type of 'PROPERTY' is not a subtype of the overridden property 。 我的代码简化版本: abstract class BaseP<V> { var view: V? = null } abstract class BaseF { fun smth() { pp.view = this } abstract val pp: BaseP<BaseF> } abstract class SubF: BaseF() { abstract […]