Tag: 仿制药

实体类型参数和内部函数

我有一个泛型函数,需要实例化其泛型参数的对象,并将其传递给某个接口的实例。 据我所知,实例化该通用对象的唯一方法是使该函数内联并且对该类型参数进行重写。 但是我不想公开这个接口的实现。 问题是内联函数不能使用内部类。 我基本上想要的是这样的: /* The interface I want to expose */ interface Params<T> { val doc: T } /* The implementation I do not want to expose */ internal class ParamsImpl<T> (override val doc: T) : Params<T> /* The function */ inline fun <reified T> doSomething(init: Params<T>.() -> Unit) { val doc= T::class.java.newInstance() […]

我可以通过T来创建KType吗?

我使用KClass<>泛型来捕获KClass<> inline fun <reified T> register(generator: Generator<T>) { register(T::class, generator) } 但KType有一些额外的属性,这对我来说很有趣,比如可空性。 我想写这样的东西来取代KType 。 inline fun <reified T> register(generator: Generator<T>) { register(T::ktype, generator) // Doesn't compile } … register<String?>(myGen) // The nullability of String? is captured 有没有办法抓取KClass<>而不是KClass<> ? 提前致谢。

从泛型函数返回特定的实例

我的问题是关于泛型方法的类型推断。 我有以下情况: interface Obj { val Id: String } data class User(override val Id: String, val name: String): Obj data class Case(override val Id: String, val subject: String): Obj interface Api { fun <T: Obj> getLastUpdated(type: KClass<T>, backTill: Duration = Duration.ofDays(1)): LastUpdated fun <T: Obj> getDetails(type: KClass<T>, uuid: String): Details<T> data class LastUpdatedResponse(val ids: List<String> […]

泛型:抽象类和孩子的类型

我有一个叫做演示者的抽象类: abstract class Presenter<V> { fun bind(view: V) { … } … } 我有这些演示者的实现: class FolderChooserPresenter : Presenter<FolderChooserView>() { … } 并查看在指定点调用绑定方法的类: class FolderChooserActivity : BaseView(), FolderChooserView { @Inject lateinit var presenter: FolderChooserPresenter // method of baseview override fun onStart() { super.onStart() presenter.bind(this) } } 我想实现的是有一个像FolderChooserActivity这样的类自动调用绑定方法的基类。 在所有的实现中重复这些调用是愚蠢的。 我的方法是有一个抽象类来扩展调用bind方法的BaseView 。 但是这显然不起作用,因为绑定类需要实现而不是抽象类。

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

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

在kotlin中,如何返回由泛型类参数定义的实例

我正在努力为kotlin 1.0.3写一个很好的Kotlin包装器。 在这个我试图混入一个函数的请求,让它通过使用杰克逊的JSON转换返回一个bean。 所以在我的图书馆我有以下 private val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) fun <T : Any> Request.asDataBean(type: KClass<T>): T = mapper.readValue(this.body(), type.java) 但是当我转而使用代码时, post("/hello", { req, res -> val bean = req.asDataBean(TestBean::class) }) 它错误地说,豆的期望值是任何。 我想要的是我的API的工作方式与上面一样,传递给asDataBean方法的泛型“类”定义是返回值的类型。 我也试过了 fun <T> Request.asDataBean(type: KClass<*>): T = mapper.readValue(this.body(), type.java) as T 以及将使用代码更改为 val bean: TestBean = req.asDataBean(TestBean::class) 希望能够正常工作,但是在使用代码时也给出了完全相同的错误。 我如何得到它使用传入的类类型定义的泛型作为参数(非常类似于所有在Java中的spring api的工作)?

了解Kotlin中的物化和通配符如何工作

如果问题的题目不是很重要,我很抱歉,但是我还没有找到更好的方法来描述这个问题。 我正在为Hadoop编写一些Kotlin扩展方法,昨天我列出了一个我不明白的奇怪错误。 我写了几个这样的扩展方法: inline fun <reified T : InputFormat<*, *>, reified K : Mapper<*, *, *, *>> Job.addMultipleInputPath(path: Path) { MultipleInputs.addInputPath(this, path, T::class.java, K::class.java) } inline fun <reified T : OutputFormat<*, *>, reified Key : Any, reified Value : Any> Job.addMultipleNamedOutput(namedOutput: String) { MultipleOutputs.addNamedOutput(this, namedOutput, T::class.java, Key::class.java, Value::class.java) } inline fun <reified T : Mapper<*, […]

如何处理泛型函数的重载解析模糊性?

考虑这个类有两个函数,一个是Int参数,另一个是通用的: class C<K, V> { // … operator fun f(index: Int): Pair<K, V> = … operator fun f(key: K): V = … } 当它被参数化为C<Int, SomeType> , K是Int ,并且这两个函数都与调用匹配,导致错误: val m = C<Int, SomeType>() mf(1) 重载分辨率模糊。 所有这些功能匹配: public final fun f(index: Int): SomeType在C定义的public final fun f(index: Int): SomeType public final fun f(key: Int): Pair<Int, SomeType>? 在C定义 […]

如何从泛型方法param获取java类?

我尝试使用下一个方法: fun <T> put(value: T){ val clazz = T::class.java } 但是有例外Kotlin: Only classes are allowed on the left hand side of a class literal 如何从泛型参数获取类? 什么是除了类的其他选项可以作为参数传递?

如何限制Kotlin扩展函数参数与扩展类型相同?

我想在泛型类型T上写一个扩展方法,其中匹配类型约束一个方法参数。 我想这个编译: "Hello".thing("world") 但不是这样,因为42不是一个字符串: "Hello".thing(42) 这个定义不起作用,因为T满足Any fun <T> T.thing(p: T) {}