Tag: 仿制药

如何解决kotlin中通用扩展方法的签名,以解决kotlin中的“类型推断失败”

我已经创建了扩展方法: @Suppress("UNCHECKED_CAST") operator fun <T : View> View.get(@IdRes id:Int): T = this.findViewById(id) as T 这种方法的主要用法: class A { lateinit var text: TextView fun init(view:View) { text = view[R.id.text] } } 这工作完美,但是当我尝试使用它没有变量: fun test() { view[R.id.text].visibility = View.GONE // error } 错误: Type inference failed: Not enough information to infer parameter T in operator fun <T […]

Kotlin对象文字实现狂放的,自我引用的通用接口

我有一个接口(在Java中)采用自引用泛型参数,我想在Kotlin中创建一个实现它的对象字面值。 在Java中,我通过不包括泛型(不安全)来做到这一点,但我不知道如何在Kotlin中做到这一点。 这里只是Kotlin的一个例子,虽然在我的情况下,接口是Java。 interface Generic<V, T : Generic<V, T>> { fun stuff(x: V) } class Test { // In Java I would write new Generic() { … } val v = object : Generic<*, *> { override fun stuff(x: Object) { doSomethingThatDoesntCareAboutTypes() } } } 我希望能够做的是这样的,但它不工作: val v = object<T : Generic<*, T>> : T […]

如何解决Kotlin有限束缚的侵犯?

假设我在Java中有这个声明,没关系。 abstract class Start<T extends End> { public T end; } abstract class End<T extends Start> { public T start; } 然而,在Kotlin中这并不好,因为Kotlin对“循环”类型参数有限制。 abstract class Start<T : End<*>> { lateinit var end: T } abstract class End<T : Start<*>> { lateinit var start: T } 在Kotlin中有没有解决这个问题的方法,以便我可以有相互依赖的泛型类型?

Kotlin:返回一个通用的接口

在Kotlin,我试图编译以下内容: 给定一个与泛型类型的接口(Printer) 和该接口的两个实现(DogPrinter和CatPrinter) 根据外部变量(AnimalType)返回其中一台打印机 下面的代码不能编译,因为需要一个类型: fun getMapper(animalType: AnimalType): Printer 我试图使用<Any>或<*>但没有成功。 有人可以帮忙吗? (通过将以下代码复制到https://try.kotlinlang.org,很容易看出错误) enum class AnimalType { CAT, DOG } class Dog class Cat interface Printer<in T> { fun mapToString(input: T): String } class DogPrinter : Printer<Dog> { override fun mapToString(input: Dog): String { return "dog" } } class CatPrinter : Printer<Cat> { override fun mapToString(input: […]

Kotlin泛型:Kotlin不承认我的类具有正确的继承

这是我的简单例子: interface IMyView interface IMyViewModel<VIEW : IMyView, in ITEM> { fun attachView(view: VIEW) fun getView(): VIEW? } class myView : IMyView class MyViewModel : IMyViewModel<myView, String> { override fun attachView(view: myView) { TODO("not implemented") } override fun getView(): myView? { TODO("not implemented") } } abstract class MyBaseClass<VIEWMODEL : IMyViewModel<out IMyView, *>> : IMyView { protected […]

什么是关键字在kotlin

我无法理解,我无法在kotlin中找到out关键字的含义。 你可以在这里查看例子: List<out T> 如果有人能解释这个的意思。 这将是非常感激的。

获取列表类与例如:列表<Number> ::类

我有一个一般类型的Builder<T> ,它需要一个构造函数参数Class<T>所以我可以保持类型。 这是一个我在java代码中使用很多的类,所以我不想更改签名。 当我尝试使用这样的构造函数: Builder<List<Number>>(List<Number>::class) 我得到一个错误:“只有类允许在类文字的左侧” 任何方式来解决这个问题? 我不能改变Builder的构造函数,太多的Java类依赖于它。 我理解整个类型的擦除问题,我真的只是想使编译器感到高兴。

Kotlin泛型超/儿童班

试图使用泛型类,但有以下问题,即: 类型不匹配:推断的类型是ChildClass但是SuperClass<SuperType>是预期的 open class SuperClass<T> where T: SuperType { fun modifySomething(input: T): T { input.someValue.inc() return input } } open class SuperType { val someValue: Int = 0 } class ChildClass : SuperClass<ChildType>() class ChildType: SuperType() { fun getModifiedValue(): Int { return someValue } } class TestEnvironment { fun testType(superClass: SuperClass<SuperType>) { // do something […]

Kotlin泛型与扩展

所以,我一直试图在Kotlin中实现一些Java,并且面临将参数传递给通配类的方法的挑战。 例如: interface A class B<in T : A> { fun pass(e: T) { /* do something */ } } class C { private val things = mutableListOf<B<*>>() fun test(e: A) { things.get(0)?.pass(e) // This doesn't work, since wildcard B generic wants Nothing, since Nothing can be safely passed to it. // but, I know […]

Kotlin的逆变

我从来没有真正理解Java中的泛型,所以似乎是Kotlin的情况。 考虑下面的代码片段(这是一个人为的例子): class AnyComparator: Comparator<Any> { override fun compare(o1: Any, o2: Any): Int { TODO("not implemented") } } fun <T> test() { val x: Comparator<in Double> = AnyComparator() // OK! val y: Comparator<in T> = AnyComparator() // Compilation error } 第二个分配失败,出现错误 Type mismatch. Required: kotlin.Comparator<in T> Found: AnyComparator 现在,如果我理解正确, in修饰符指示T只被泛型类型Comparator (它使逆变)消耗,所以我应该能够分配任何具有类型参数E Comparator ,它是T的基类。 基于此,我应该能够将AnyComparator分配给变量x和y ,因为Any类型是Kotlin中每个类的基类。 […]