Tag: generics

Kotlingenerics和错误的types推断

考虑一个普通的class Item和inheritance它的特定class Event : open class Item { fun copyFrom(item: T) { if (this is Event && item is Event) { owner = item.owner value = item.value } } } class Event : Item { open var owner = “” open var value = 0 } 感谢types推理,我们不必将物品投射到事件,我们可以直接访问owner和value 。 但是它表示该item是Ttypes,不能转换为item is Event子句。 我相信这不应该发生,因为这个条款在Java中是正确的? 编辑: 我意识到copyFrom实现应该在Event完成,但这只是为了演示types推断问题。

科特林计算与generics的标准差

我想写一个方法来计算提供的数字的标准偏差。 这里是这样的: fun calculateSD(numArray: List): Double { var sum = 0.0 var standardDeviation = 0.0 for (num in numArray) { sum += num } val mean = sum / numArray.size for (num in numArray) { standardDeviation += Math.pow(num – mean, 2.0) } val divider = numArray.size – 1 return Math.sqrt(standardDeviation / divider) } 但是,我想这也工作列表双,浮动等 所以它需要使用generics: […]

如何使用kotlin创建在构造函数中传递方法引用的generics类的实例

现在,我正在使用kotlin作为我的主要编程语言,我正试图简化Android的Recyclerview实现逻辑,我被困在以下几点: 比方说,我已经定义了下面的ViewHolder类,通过构造函数中的方法引用传播点击位置事件。 class CustomViewHolder(itemView: View, val onClick: (Int) -> Unit)) : RecyclerView.ViewHolder(itemView){ itemView.setOnClickListener { onClick.invoke(adapterPosition) } } 我怎样才能构建一个在构造函数中有方法引用的generics类的实例? 我的recyclerview实现在构造函数中有一个generics类,也是一个实体引用,可以通过在onCreateViewHolder上的reflection来创建我的CustomViewHolder类的实例: class CustomAdapter(val entityClass: Class) : RecyclerView.Adapter() { /* Usual recyclerview stuff */ //Method that I want to be called when a list item is clicked fun onListItemClicked(position: Int) { //do stuff } override fun onCreateViewHolder(parent: ViewGroup, […]

Java / Kotlin使用generics返回types为访问者模式强制转换exception

我试图使用类似访问者模式, 但与返回值。 但是,虽然没有明确的转换,但我得到一个ClassCastException: Exception in thread “main” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.CharSequence; at Printer.combine(…) at Split.accept(…) at MWEKt.main(…) 码: interface TreeElem { fun accept(visitor: TreeVisitor): T } class Leaf: TreeElem { override fun accept(visitor: TreeVisitor): T { return visitor.visit(this) } } class Split(val left: TreeElem, val right: TreeElem): TreeElem { override fun accept(visitor: […]

Kotlin:如何在运行时在OneClass 中获得实际的genericstypesT.

朋友们! 我是Kotlin的绿手,现在这是一个问题。 现在我想在OneClass中获得genericstypesT,下面是一些外围代码。 // IDatabase.kt package com.ra abstract class IDatabase { } // Database1.kt import kotlin.reflect.jvm.javaType open class Database1: IDatabase() { val tClass = this::class.supertypes[0].arguments[0].type!!.javaType as Class } // Database2.kt import kotlin.reflect.jvm.javaType open class Database2: IDatabase() { val tClass = this::class.supertypes[0].arguments[0].type!!.javaType as Class // just wrap a `object` to confort the user companion object { […]

Java / Kotlingenerics

我有一个模板/generics的问题。 这是我目前的代码 data class RealmWatcher( val results: RealmResults, val handler: (RealmResults) -> Unit) 然后在Android片段中使用它来侦听特定的结果并根据更改执行操作。 所以我们以此为例 private val realmListener = arrayOf( RealmWatcher(Realm.getDefaultInstance().where(Notification::class.java).equalTo(“isNew”, true).findAll(), { n: RealmResults -> // DO STUFF }) 我正在做这个片段的开始/停止 override fun onResume() { super.onResume() // start listening and execute realmListener.forEach { it.handler(it.results) } realmListener.forEach { it.results.addChangeListener(it.handler) } } override fun onPause() { // […]

我怎样才能实例java类像A:扩展B在kotlin中实现C.

我有这样的Java类: public class SomeClass { public SomeClass(T a, T b) {} } class A extends ClassA implements InterfaceA{} class B extends ClassA implements InterfaceA{} 我试图在下面的kotlin中创建SomeClass的一个实例,但我得到一个编译错误: “感染typesAny!不是ClassA的子types” 但我知道如何解决它。 下面的A和B扩展了ClassA并实现了InterfaceA 。 val someClass = SomeClass(A(), B()) 有人可以帮忙吗?

任何方式在Kotlin中从相同的通用接口inheritance两次(使用单独的types)?

我在我的代码中有一个场景,我想要一个类实现两个不同types的接口,如下面的示例: interface Speaker { fun talk(value: T) } class Multilinguist : Speaker, Speaker { override fun talk(value: String) { println(“greetings”) } override fun talk(value: Float) { // Do something fun like transmit it along a serial port } } 科特林对此并不满意,理由是: Type parameter T of ‘Speaker’ has inconsistent values: kotlin.String, kotlin.Float A supertype appears twice 我知道一个可能的解决方案是实现下面的代码,在那里我用实现接口,然后检查自己的types并将它们委托给它们的函数。 […]

Kotlin编译器的types推断不能选择调用哪个方法(与genericstypes不一致)

所以,我有一些这些签名的Java方法(为简单起见,删除了注释和代码体): public class JavaClass { public static E join(E… array) { … } public static E join(CharSequence separator, E… array) { … } } 我在Kotlin中有一些代码,它调用了’join’方法: class KtClass { fun test(vararg array: String) { JavaClass.join(*array) } } 到现在为止还挺好; 它会传播可变参数并称之为方法签名。 好的! 例如,如果我想用“分隔符”参数来调用后一个方法签名,就会出现问题: class KtClass { fun test(vararg array: String) { JavaClass.join(“”, *array) } } 这段代码不会编译。 编译器无法决定调用哪个方法。 错误: […]

Kotlin中的通用lambda或函数值types

给定一个函数 fun to5(x: T): Int = 5 有没有可能像这样将其赋值给variables(值) funVal ? val funVal: (T) -> Int = ::to5 无 未解决的参考:T 错误? 换句话说,有可能以某种方式告诉Kotlin funValtypes声明中的T是一个types参数? 比如像这样: val funVal: (T) -> Int = ::to5 val funVal: (T) -> Int = ::to5 val funVal: (T) -> Int = ::to5 val funVal: ((T) -> Int) = ::to5 用例 我的用例是使用generics的咖喱。 概念: fun […]