Tag: 仿制药

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

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

如何以类型安全的方式从通用列表中检索项目

我想把项目放在一个通用的容器中,但以类型安全的方式检索它们。 容器在添加时会为每个项目添加一个序列号。 我试图在Kotlin中实现这个,但在pens()方法中遇到了问题。 有没有办法在函数参数中使用类型信息来定义返回值的类型? import java.util.concurrent.atomic.AtomicInteger import kotlin.reflect.KClass interface Item data class Pen(val name: String) : Item data class Eraser(val name: String) : Item data class Ref<out T : Item> (val id: Int, val item: T) class Container<T: Item> { private val seq = AtomicInteger(0) private val items: MutableList<Ref<T>> = mutableListOf() fun add(item: T) = […]

如何链接两个Kotlin函数参数的泛型?

我想写一些像 fun <T, R> check(thing: T, property: KProperty1<T, R>, value: R) = property.get(thing) == value 以便 assertTrue(check("Hello", String::length, 5)) 但 assertTrue(check("Hello", String::length, "banana")) 不编译。

是否有一种方法要求泛型类型是Kotlin中的数据类?

以下不起作用,但希望可以帮助你明白我的意思: class Example<T : DataClass> 如果你想知道我正在努力完成什么,这是我想到的一个例子: class Repository<T> where T : Entity, // Entity defines mutable property 'id' T : DataClass { // assume there is a map here fun add(obj: T) { val copy = obj.copy(id = generateID()) map.put(copy.id, copy) } } 还是有更好的方法来完成我想要做的?

泛型函数的参考

是否可以引用Kotlin中的泛型函数? 例如,假设我有一个函数: fun inline <reified T> appendToString(a: T, b: T) = a.toString() + b.toString 你怎么能参考这个功能? 这不会编译 var a = ::appendToString<Int>

Kotlin扩展通用函数与基本类型没有反射API

我有一个Java对象具有方法getLong , getBoolean和getString 。 我试图做一个通用的扩展函数,它具有作为最后一个参数的功能。 本质上包装的尝试和捕获和调用getString等可能会引发异常。 当我调用getIt<Long>() { // do something with it }我发现<reified T>需要反射api来找出T 我不能做的是检查也不isInstance。 有任何想法吗? // This is the non generic function version to get an idea inline fun JSONObject.getItLong(key: String, block: (value: Long) -> Unit) { try { block(this.getLong(key)) } catch (e: JSONException) { Log.w("${ javaClass.simpleName }KEx", e.message) } } 下面的when不起作用。 inline […]

Kotlin中的关键字关键词究竟是干什么的?

我试图理解关键字关键字的目的,显然它允许我们对泛型进行思考 。 但是,当我离开它时,它工作得很好。 任何人都在意解释什么时候会产生实际的差异?

与Kotlin中的伴随对象一起扩展类

我写下面的代码,但它不起作用,因为我得到一个未解决的参考错误。 class Chromosome { constructor() {} companion object { fun newInstance(): Chromosome { return Chromosome() } } } class Population<T>(size: Int) where T: Chromosome { var population: Array<T> = Array(size, { _ -> T.newInstance() }) } 我想要一个扩展某个类或接口的泛型类型T. 我需要调用静态工厂方法,因为我不能在Array类构造函数中写T() 。 有什么办法来包装数组类调用默认的构造函数? 我尝试了一种不同的方法,但它仍然不起作用。 这次我得到一个不能使用'T'作为通用类型参数。 使用类而不是错误。 class Population<T>(size: Int, init: () -> T) where T: Chromosome { var […]

在Kotlin中使用泛化泛型的正确方法

我想重写SharedPreferences小扩展函数。 现在看起来像这样 fun SharedPreferences.put(arg: Pair<String, Any>) { val e = edit() val s = arg.second when (s) { is Int -> e.putInt(arg.first, s) is String -> e.putString(arg.first, s) is Boolean -> e.putBoolean(arg.first, s) is Long -> e.putLong(arg.first, s) else -> throw NotImplementedError("Extension not implemented for this type") } e.apply() } 是否有什么惯用的方式来使用泛型? 我的第一个猜测是 inline fun <reified […]

让非泛型类在构造函数中使用泛型参数

我想在kotlin中有一个非泛型的类,在其构造函数中使用泛型来指定一个参数。 但是,我不知道如何做到这一点,Intellij的Java-to-Kotlin转换器打破了。 我的java类看起来像这样 public class Test { interface I1 { } interface I2 { } private final I1 mI1; private final I2 mI2; public <T extends I1 & I2> Test(T host) { mI1 = host; mI2 = host; } } 转换器的输出看起来像这样。 class Test(host: T) where T: I1, T: I2 { internal interface I1 internal interface […]