Tag: 仿制药

使用泛型的类型化类型的构造函数

我正在学习Kotlin。 但是我在下面的例子中遇到了麻烦。 当我输入一个我自己创建的类时,我可以使用正常的构造函数,但是我不能用Kotlin列表类型做同样的事情。 我在这里错过了什么? class Example<T> {} typealias Ex<T> = Example<T> // typealias for example class typealias L<T> = List<T> // typealias for Kotlin list class fun main(args: Array<String>) { Ex<Int>() // OK! compiles L<Int>(0,{ _ -> 1}) // unresolved reference }

比较Kotlin中的可比较列表

我试图编写一个比较两个可比较列表的函数。 只要被比较的两个表中的相同位置上的元素是可比较的,可比较物就可以是各种类型的。 例: val list1 = ArrayList<Comparable<*>>() val list2 = ArrayList<Comparable<*>>() list1.add(10) list1.add("xyz") list1.add('a') list2.add(10) list2.add("xyz") list2.add('b') println(compare(list1, list2)) 这应该打印-1因为 10 == 10 “xyz”==“xyz” 'a'<'b' 因此list1 <list2。 下面是我用一些试验和错误过程把代码放在一起,因为我对这个具体情况下泛型如何工作有点困惑: fun <T> compare(list1: List<Comparable<T>>, list2: List<Comparable<T>>): Int { for (i in 0..Math.max(list1.size, list2.size) – 1) { val elem1 = if (i < list1.size) list1[i] else null val […]

Kotlin的泛型必须写入类型参数

在java中,我定义了一个类 public abstract class AdapterItem<T extends AdapterItem> {} 然后,我把这个类的数据列表 List<AdapterItem> topics 而且我必须把这些“主题”交给一个kotlin班 而我的课是: class ShareDialogFragment(val mTopics: List<AdapterItem>) {} 但我得到一个错误:“类型参数是必需的”。 我不得不将List<AdapterItem>更改为List<AdapterItem<out AdapterItem>> ,而不是结束。 我仍然有错误。因为AdapterItem仍然需要类型的争论。 我的解决方案是将其替换为List<AdapterItem<TopicItem>> (topicItem是AdapterItem的子类) 但更糟糕的是 任何人都有解决办法?

Kotlin编译与泛型和自动类型转换有关的错误

我认为这个代码片段应该编译: package bug import java.lang.reflect.* data class Descriptor(val clazz: Class<*>, val modifiers: Int, val info: List<String>) { constructor(clazz: Class<*>, modifiers: Int, vararg info: List<String>) : this(clazz, modifiers, mutableListOf<String>().apply { info.forEach { this@apply.addAll(it) } }) } private val AnnotatedElement.info: List<String> get() = getAnnotation(Info::class.java)?.values?.toList() ?: listOf<String>() annotation class Info(val values: Array<String>) /** * A simple abstraction of […]

在Kotlin中,如何使用本机java参数实例化一个泛型类?

我正在与Kotlin一起探索使用BDB JE(Berkeley DB Java版)。 BDB的知识并不需要回答这个问题。 BDB有一个如下所示的方法: store.getPrimaryIndex(Int::class.java, "Int", Person::class.java, "Person") 我想做一般的事情,所以我写了这个 inline fun <reified TModel : Any, reified TKey : Any> getIndex() = return store.getPrimaryIndex(TKey::class.java, TKey::class.simpleName, TModel::class.java, Model::class.simpleName) 到现在为止还挺好。 我现在想把这个索引对象传递给一个类,如下所示: class ModelStore<TModel, TKey>(index : PrimaryIndex<TKey, TModel>) { private val index = index fun get(key : TKey): TModel = index.get(key) fun put(model : TModel) = index.put(model) […]

如何正确地覆盖返回Kotlin中的泛型类实例的方法

我有一个抽象的泛型类: abstract class BasePresenter<View, Router> { var view: View? = null var router: Router? = null abstract fun OnStart() abstract fun OnStop() } 我有它的一个子类: class NewsListPresenter : BasePresenter<NewsListView, MainRouter>() { override fun OnStop() { // } override fun OnStart() { // } } 另外我有一个受保护的抽象方法的类: protected abstract fun getPresenter() : BasePresenter<Any?, Any?> 我把它覆盖在一个子类中: override fun getPresenter(): […]

kotlin中的高阶(或递归?)泛型类型参数

我正在对一些高度声明的代码进行原型设计,Kotlin附带的类型推断和安全性也有很大帮助。 其中一个目标是使主要类型的扩展(子类)很容易实现。 为了保持丰富的类型推理和表现力,我在定义针对子类的通用扩展函数方面取得了一些成功。 所有的子类方法的类型信息都没有额外的子类实现,这是很好的。 所以我试图写一个丰富的通用函数,尽可能多地保持类型信息。 这个问题随着这个函数对潜在的递归泛型类型进行操作,我想要对泛型类型参数进行混洗。 没有一个例子,这是不可能的。 所以考虑: open class G<in T> class A<in T> : G<T>() class B<in T> : G<T>() class C<in T> : G<T>() val ba = B<A<*>>() val cb = C<B<*>>() 除了一般情况,我们需要一个可以有效执行此操作的函数 fun B<A<*>>.doTransitiveThing(c: C<B<*>>) : C<A<*>> { // implement } val ca = ba.doTransitiveThing(cb) // Returns C<A<*>> 目标标准: 将C作为参数并返回C ,但使用不同的泛型类型参数 […]

Kotlin类型与泛型不匹配

我最近遇到了关于安全导航操作符( ?. )和泛型的问题。 class A<T : Any?>(private var value: T) { fun function() { value?.let { val notNull: Any = it // ^^ // Type mismatch: // Required: Any // Found: T } } } 我相信上面的代码应该没有问题运行,但会产生上面显示的错误。 我错过了什么吗?

在Kotlin中实例化通用数组

为什么这不编译? 我得到3行的编译错误 不能使用T作为实体类型参数。 改用类 class Matrix2d<T>(val rows: Int, val cols: Int, init: (Int, Int) -> T) { var data = Array(rows * cols, { i -> val r = Math.floor(i.toDouble() / cols).toInt() init(r, i – r * cols) }) operator fun get(row: Int, col: Int): T = data[row * cols + col] operator fun set(row: […]

Kotlin接口中的克拉语法

可能有助于解释这一点。 假设我有一个名为Page的抽象类,如下所示: abstract class Page { abstract fun title() : String } 而一个名为Book的界面: interface Book { fun write(page: Page) fun read(title: String) Page } 我的问题是,如何使用克拉通用语法来指定该方法必须由Page类的派生实例使用。 也许这样: interface Book<Page> { fun write(page: Page) fun read(title: String) : Page } class AdventureBookPage(val pageTitle: String, val content: String) : Page() { override fun title() : String { return […]