Tag: generics

如何在Kotlin中使用Gson的TypeToken +generics

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

需要Kotlin函数什么都不是,而是定义为一个不同的types

我像这样定义了一个类 abstract class MvpViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) where P : BasePresenter { protected var presenter: P? = null fun bindPresenter(presenter: P): Unit { this.presenter = presenter presenter.bindView(itemView) } } presenter.bindView(itemView)给我一个错误,说明Type mismatch, required: Nothing, found: View! 。 我已经在presenter类中定义了bindView ,就像这样 abstract class BasePresenter { var view: WeakReference? = null var model: M? = null fun bindView(view: V) […]

在Kotlin中可变参数的lambdatypes?

是否有可能作为内联lambda参数接收一个函数types,它具有保证的返回typesR但可变参数的数量 ? 为简单起见,请考虑以下几点: inline fun Boolean?.tfn(tru:()->R, fls:()->R, nul:()->R) = if (this == null) nul() else if (this) tru() else fls() 让我们假设我有其他的内联函数,也可能是(A)->R或(A,B)->R或(A,B,C)->Rtypes的lambda参数 ,其参数我想传递给这个函数。 他们都将提供一个R但是他们都必须被调用来获得R ,而不知道这个函数中参数的数量/types/值。 有没有办法一般修改上面的function: 捕获返回R作为其输入的任何lambda参数的一般情况 避免对将调用此函数的其他内联函数进行任何更改 保持内联效率

包含generics的Kotlin函数的内联别名?

根据我在前面的问题中收到的建议,我用“别名”缩短了一些常用的外部函数(我不能控制的)的名字。 这对扩展function很好用; 不过,我还有一些顶级函数,我想要别名。 对于一个简单的例子,考虑generateSequence函数。 我想能够做到这一点: // DOES NOT COMPILE inline val seq:(()->T?)->Sequence get() = ::generateSequence …但是我不能这样做,因为在接收器types中必须使用generics,正如在这个答案中所解释的那样。 是否有任何其他方式来创建一个保留内联的顶级function(需要generics)的别名? 编辑:我试过使用Any? 和明星投影后发布的问题,但我仍然不认为这是一个很好的答案: inline val seq:(()->Any?)->Sequence get() = ::generateSequence 这似乎boptimalsu,因为它妥协对序列的元素types的types检查,正确的? 关于什么可以工作的其他答案/想法?

Java或Scala中Kotlin的types实现是不可能实现的?

我最熟悉的Javatypes擦除(及其所有的问题和好处)。 我对Kotlintypes系统的扩展可能性有一些限制,但是我不清楚types实例是如何在面向擦除的JVM上工作的。 什么是types实现,Kotlin如何在JVM上实现,这与Java的types擦除和Scala的复杂types系统有何不同?

如何从generic observable订阅PublishRelay?

科特林代码: fun Observable.circuitBreaker(): Observable { val relay = PublishRelay.create() this.subscribe(relay) return relay.toFlowable(BackpressureStrategy.LATEST).toObservable() } 上面是一个我正试图转换成Swift的Kotlin代码。 但是,我正面临一个错误,说不能将types’PublishRelay’types的值转换为期望的参数types’(Event ) – > Void’ SWIFT代码: extension Observable { func circuitBreaker() -> Observable { let relay = PublishRelay() self.subscribe(relay) return relay.asObservable() } } 任何帮助,将不胜感激。

如何访问generics类参数中的属性/方法

来自C#的Kotlin新手。 我想创建一个类,通过generics需要一个可互换的类对象。 在类中,我想访问类中的属性值和调用方法。 我认为这必须通过某种反思机制。 挖掘Kotlin引用我一直在尝试应用建议到我的代码,但是我得到一些神秘的错误。 任何帮助表示赞赏。 Error:(35, 20) Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: @InlineOnly public operator inline fun Lazy.getValue(thisRef: Any?, property: KProperty): T1? defined in kotlin @InlineOnly public operator inline fun Map.getValue(thisRef: Any?, property: KProperty): T1? defined in kotlin.collections @SinceKotlin public fun Map<Class, T1?>.getValue(key: Class): […]

inheritance时kotlinvariables参数错误

open class A(vararg vars: String) class B(vararg vars: String):A(vars) 错误: 必需:find的字符串:数组 如何解决这个问题呢?

Kotlin – 当用返回types的函数expression时

我想利用kotlin的expression式和generics方法来简化Android的共享偏好api。 而不是一直调用getString()&getInt()等,我想要做的是创建一个扩展函数,它将根据函数的返回types进行切换,并调用适当的方法。 如下所示: fun SharedPreferences.get(key: String): T? { when (T) { //how do I switch on return type and call appropriate function? is String -> getString(key, null) is Int -> getInt(key, -1) is Boolean -> getBoolean(key, false) is Float -> getFloat(key, -1f) is Long -> getLong(key, -1) } return null } 当然,这是行不通的。 但是在expression函数的返回types时有什么解决方案吗? 所有的建议都欢迎。

Kotlin中generics类的用法

我正在尝试编写一个通用的基本活动,它指定它的ViewModel键入一个通用的参数: abstract class BaseActivity : AppCompatActivity() 现在我正在尝试为ViewModel编写一个延迟的初始化属性: val viewModel by lazy { ViewModelProviders.of(this, getFactory()).get(T) } 显示的错误是Type Parameter T is not an expression 还使用::class或::class.java没有帮助。 谁能解释一下这个问题吗? 编辑:我试图使用像这样的一个具体化的内联函数: inline fun AppCompatActivity.obtainViewModel(factory: ViewModelProvider.Factory): T { return ViewModelProviders.of(this, factory).get(T::class.java) } 像这样使用它: abstract class BaseActivity : AppCompatActivity() { val viewModel by lazy { obtainViewModel(getFactory()) } 现在我得到错误,T不能被用作一个具体的参数。 编辑2:到目前为止最好的解决方案似乎是这样的: 链接 ,但它的开销,以实现每个扩展类中的抽象标记。