Tag: 仿制药

如何在Kotlin的重载操作符上指定generics?

我正在寻找超载除法运算符“/”,但希望允许指定genericstypes来指导返回值的types。 这是一个例子: inline operator fun MyType.div(fieldName: String): T { val value = someFunction(fieldName) return convertToExpectedValue(value) } 不幸的是,我无法想出一个方法来明确指定genericstypesT,当它不能被推断。 我想知道是否有像以下这样的工作? val stringVal = myType / “myField” / “myStringField” 请注意,我知道这一点 myType.div(“blah”) 作品。 我正在寻找使用运算符“/”的东西。

Kotlin的generics:generics映射参数中的types不匹配

我有以下使用generics的代码: abstract class Event(val name: String) interface ValueConverter { fun convert(event: E): Float fun getEventClass(): Class } class ValueConverters { private val converters = HashMap<String, ValueConverter>() fun register(converter: ValueConverter) { converters.put(converter.getEventClass().name, converter) } fun unregister(eventClass: Class) { converters.remove(eventClass.name) } fun convert(event: E): Float { return converters[event.javaClass.name]?.convert(event) ?: 0.0f } fun clear() { converters.clear() } } […]

不允许对超types的直接子types进行投影

我有一个像下面这样的抽象类: abstract class AbstractSync<out C : Configuration> : ISync { internal abstract val configuration: C … } 我想要另一个inheritance自这个的抽象类: abstract class CascadedSync : AbstractSync {} CascadedSync类不应修改通用参数C,实际上它只应实现一个ISync的方法,而不是其他的方法。 我正在尝试不同的语法来实现这个看似简单的任务。 在Java中,这看起来就像这样: abstract class CascadedSync extends AbstractSync { } 在IntelliJ的帮助下将其翻译成Kotlin会产生如下结果: abstract class CascadedSync : AbstractSync() 但在同一时间给出了以下错误: 不允许对超types的直接子types进行投影 什么是正确的语法?

generics接口中的超出投影types禁止使用具有generics参数的metod

我开始使用Kotlin,并定义如下界面: interface AAdapter { fun onCreateAViewHolder(parent: ViewGroup): VH fun onBindAViewHolder(v: VH, position: Int) } 当我尝试在代码上使用它时: class Klasa ( private val adapter: AAdapter ) { fun doSth(){ //… val vh = this.adapter.onCreateAViewHolder(parent) //on below line I get error adapter.onBindAViewHolder(v, position) //… } } 我得到一个错误: Out-projected type’AAdapter ‘禁止使用’public abstract fun onBindAViewHolder(v:T,position:Int):Unit 我绑定添加“在”或“出”定义,但我很困惑。 如何让它。

如何指定一个types参数我不知道

我已经将我的问题减少到了下面的最小范例: interface Property<T : Comparable> fun <T : Comparable> parsePropertyValue(property: Property, value: String): T = TODO() fun test() { val property: Property = TODO() val value = parsePropertyValue(property, “test”) } 对parsePropertyValue的调用不会编译,并显示错误消息“无法推断types参数T”。 等效的Java代码编译没有问题: interface JavaProperty<T extends Comparable> { } class Test { public static void main(String[] args) { JavaProperty property = null; Comparable value = parsePropertyValue(property, […]

为什么使用声明 – 站点差异

这不是一个Kotlin的具体问题,但我想更好地理解为什么我会使用声明站点方差(协变和逆变)。 我知道如何使用它们,我只是没有看到太多的好处,或者在哪种情况下,我应该选择一个优先于另一个,为什么我不想一直使用Use-site方差。

有没有可能在Kotlin中创建对伴侣对象generics方法的引用?

是否有可能将一个variables的值设置为一个方法,其中该方法是一个Companion对象,并有一个types参数? 像下面这样: class A { companion object B { fun foo(n: T) { } } } val b = AB::foo

如何处理从Java迁移到Kotlin的generics边界?

我的目标是让接口方法接受实现的类types。 这是我迄今写的代码: internal interface Diff { //in Java I was using fun lessThan(other: Diff): Boolean } private class ADiff(private val value: Int) : Diff { override fun lessThan(other: ADiff): Boolean { return value < other.value } } //B can now accept even int types which is not desired private class BDiff(private val value: Int) : […]

Kotlin:为什么一元加/减不能从任务推断generics?

为什么一元加/减不能从派生中推断generics? 使用invoke ,例如: inline operator fun invoke(): T 你可以调用方法,并能够使用它…例如val foo: Long = this() 但是,以同样的方式使用unaryPlus或unaryMinus不起作用。 方法签名: inline operator fun unaryPlus(): T 非工作电话: val foo: Long = +this

有没有办法绕过Java无法将generics参数转换为非generics?

在C ++中,我可以像这样编写代码: class Shader { … void setUniform(GLuint handle, int value); void setUniform(GLuint handle, float value); void setUniform(GLuint handle, const std::vector &value); … }; class UniformValueBase { … GLuint handle; Shader &shader; virtual void apply() = 0; }; template class UniformValue: public UniformValueBase { … T value; virtual void apply() override { shader.setUniform(handle, value); }; […]