草庐IT

generics - 将参数传递给具有多个上限的泛型函数

无法将参数传递给Combiner().combine()函数。AndroidStudio无法识别arg扩展了Foo并实现了Bar。我做错了什么?abstractclassFoo{valf:Int=1}interfaceBar{valb:Stringget()="a"}classCombiner{funcombine(arg:T):PairwhereT:Foo,T:Bar{returnarg.ftoarg.b}}classProgram{funmain(){vallist:List=arrayListOf()list.forEach{if(itisBar){Combiner().comb

generics - Kotlin 外投影类型禁止使用

我最近在Kotlin中尝试了以下内容。这个想法是我将接收一个扩展BaseItem的Item(例如AmericanItem)作为输入。我正在尝试为每个这些项目使用不同的解析器这是一个示例代码abstractclassBaseItemclassAmericanItem:BaseItem()classEuropeanItem:BaseItem()interfaceItemParser{funparse(item:T)}classAmericanItemParser:ItemParser{overridefunparse(item:AmericanItem){println("American

generics - Kotlin 强制可空泛型类型转换为同一泛型类型的不可空泛型?

首先我只想指出,我知道Forceanullintonon-nullabletype和KotlinGenericsandnullableClasstype但我不认为这些问题和我的一样(如果我错了,请纠正我)。背景我正在开发一个名为Awaitility的库简而言之,它旨在等待谓词评估为真。KotlinAPI提供了一种编写这样的表达式的方法://CreateasimpledataclassexampledataclassData(varvalue:String)//AfakerepositorythatreturnsapossiblynullableinstanceofDatainterfa

generics - Kotlin 实体化类型参数不智能转换

我正在尝试设置未初始化值,并试图让以下工作。这主要是对物化泛型的力量(和局限性)的好奇。我试图为数据类的可选参数提供默认值。inlinefununinitialized():T=when(T::class){Long::class->-1L//Typemismatch.Required:TFound:LongString::class->""//Typemismatch.Required:TFound:String//andsoon...else->throwUnsupportedOperationException("Nouninitializedvaluedefinedfor"+T

generics - Kotlin:覆盖子类型中的通用属性

我尝试编写一些通用代码,但无法摆脱Typeof'PROPERTY'isnotasubtypeoftheoverriddenproperty错误。我的代码的简化版:abstractclassBaseP{varview:V?=null}abstractclassBaseF{funsmth(){pp.view=this}abstractvalpp:BaseP}abstractclassSubF:BaseF(){abstractoverridevalpp:BaseP//Error:(20,30)Typeof'pp'isnotasubtypeoftheoverriddenproperty'pub

generics - Kotlin - 不尊重泛型类型参数

考虑以下示例:importkotlin.reflect.KProperty1infixfunKProperty1.test(value:R)=UnitdataclassFoo(valbar:Int)funmain(){Foo::bartest"Hello"}鉴于test期望value类型为R,为什么在这种情况下,属性类型是Int,它允许我传递一个String吗? 最佳答案 首先看一下接口(interface)的声明KProperty1,即:interfaceKProperty1:KProperty,(T)->R这里的重要部分是out

generics - 具有通用参数和使用类型参数的方法的 Kotlin 抽象类

我正在尝试创建一个带有泛型参数的抽象类,该类将具有应该调用方法的子类无需指定类型参数。到目前为止我有这个:abstractclassAbstractClass@Autowiredconstructor(protectedvaldelegate:MyService){inlinefunmyMethod(param:Any):T?{returndelegate.myMethod(param).`as`(T::class.java)}}及实现:classTesterWork@Autowiredconstructor(delegate:MyService):AbstractClass(dele

generics - 比较 Kotlin 中的可比对象列表

我正在尝试编写一个比较两个可比较列表的函数。只要被比较的两个列表中相同位置的元素具有可比性,可比较对象可以是各种类型。示例:vallist1=ArrayList>()vallist2=ArrayList>()list1.add(10)list1.add("xyz")list1.add('a')list2.add(10)list2.add("xyz")list2.add('b')println(compare(list1,list2))这应该打印-1因为10==10“xyz”==“xyz”'a'因此list1由于我对泛型在这种特定情况下的工作方式有点困惑,因此我将代码与一些试错过程放在一

generics - 在 Kotlin 中实例化泛型数组

为什么这不能编译?我在3行得到编译错误CannotuseTasreifiedtypeparameter.UseclassinsteadclassMatrix2d(valrows:Int,valcols:Int,init:(Int,Int)->T){vardata=Array(rows*cols,{i->valr=Math.floor(i.toDouble()/cols).toInt()init(r,i-r*cols)})operatorfunget(row:Int,col:Int):T=data[row*cols+col]operatorfunset(row:Int,col:Int,v

generics - 如何将 Kotlin 扩展函数参数约束为与扩展类型相同?

我想在泛型类型T上编写一个扩展方法,其中匹配的类型约束一个方法参数。我想编译这个:"Hello".thing("world")但不是这个,因为42不是字符串:"Hello".thing(42)这个定义不成立,因为T满足AnyfunT.thing(p:T){} 最佳答案 如@AlexanderUdalov所述无法直接执行,但有一种解决方法,您可以在其他类型上定义扩展方法,如下所示:dataclassWrapper(valvalue:T)valT.ext:Wrapperget()=Wrapper(this)funWrapper.thin