Tag: 类型

通过子类来改变Kotlin中类型参数的变化

这个问题来源于我之前关于Kotlin泛型的问题 。 请在这里查看更多关于这个问题背后动机的信息。 我有一个类不受约束的类型参数 trait Handler<T> { fun handle(result: T) } 我需要创建一个Handler实例,其中T是List<O> ,因此是不可变的。 我的想法是子类Handler和注释它作为一个消费者(即通过使用) – trait ListHandler<in T>: Handler<List<T>> { } 然而,这给了我一个错误,说: “参数T被声明为'在',但发生在'不变'的位置Handler<List<T> ” 错误是什么意思,有什么办法可以解决它?

函数参数类型匹配问题

IntelliJ向我抛出以下错误,但是我可以告诉,没有任何问题。 最小的例子 import org.springframework.jdbc.core.JdbcTemplate // … var jdbcTemplate: JdbcTemplate? = null // … relying on dependency injection from Spring if (jdbcTemplate == null) { throw RuntimeException("jdbcTemplate not injected correctly") } jdbcTemplate.execute("DROP TABLE customers IF EXISTS") 该函数有三个实现。 其中一个接受一个String 。 字符串就是我所给的。 那么到底是什么? 我努力了: 使缓存无效并重新启动IntelloJ 通过./gradlew build + :compileKotlin e: /home/ruben/workspace/campingmanager/src/main/kotlin/hello/Application.kt: (27, 22): None of the following functions […]

为什么不Kotlin数组<T>实现Iterable <T>

为什么Kotlin的Array<T>类不能实现Iterable<T> ? 快速浏览一下文档,发现它也有一个iterator()方法。

如何正确处理Kotlin中大于127的字节值?

想象一下,我有一个带有Byte类型的变量b的Kotlin程序,外部系统写入的值大于127 。 “外部”意味着我不能改变它返回的值的类型。 val a:Int = 128 val b:Byte = a.toByte() a.toByte()和b.toInt()返回-128 。 想象一下,我想从变量b得到正确的值( 128 )。 我该怎么做? 换句话说: magicallyExtractRightValue什么实现会使下面的测试运行? @Test fun testByteConversion() { val a:Int = 128 val b:Byte = a.toByte() System.out.println(a.toByte()) System.out.println(b.toInt()) val c:Int = magicallyExtractRightValue(b) Assertions.assertThat(c).isEqualTo(128) } private fun magicallyExtractRightValue(b: Byte): Int { throw UnsupportedOperationException("not implemented") } 更新1:由Thilo建议的这个解决方案似乎工作。 private fun magicallyExtractRightValue(o: Byte): Int […]

我如何在Kotlin中声明一个可以是字符串或函数的函数参数?

在下面的函数中,我想传递一个html标签的属性。 这些属性可以是字符串( test("id", "123") )或函数( test("onclick", {_ -> window.alert("Hi!")}) ): fun test(attr:String, value:dynamic):Unit {…} 我尝试将参数value声明为Any ,Kotlin中的根类型。 但函数不是Any类型的。 声明类型为dynamic工作,但是 dynamic不是一种类型。 它只是关闭输入检查参数。 dynamic只适用于kotlin-js(Javascript)。 我如何在Kotlin(Java)中编写这个函数? 函数类型与Any有什么关系? 是否有包含函数类型和Any类型?

为什么不能在Kotlin类型参数有其他界限,如果它是由另一个类型的参数?

这是显示这个问题的最小的演示代码: interface A fun <T1, T2> test() where T2 : T1, T2 : A {} 当我尝试编译它时,编译器会抱怨: 错误:(81,25)Kotlin:如果类型参数受另一个类型参数限制,则不能有任何其他边界 我阅读Kotlin语言规范 ,但只能找到以下约束限制: 类型参数不能将自身指定为自己的边界,并且几个类型参数不能以循环的方式将对方指定为边界。 这并不能解释我遇到的限制。 我研究了Kotlin的问题跟踪器,并且发现了一个关于这个限制的问题: 允许从另一个类型参数和类继承一个类型参数:KT-13768 。 然而,这个问题已经被拒绝,原因如下(2017年5月6日更新:这个问题已经由Stanislav Erokhin重新开放): 如果我们删除了这个限制,我认为我们不能将代码正确地编译到JVM上。 由安德烈Breslav 所以问题是:如果我们删除这个限制,为什么我们不能正确地将代码编译到JVM? 相同的演示在Scala中工作: trait A def test[T1, T2 <: T1 with A](): Unit = {} 这表明Scala可以将代码正确地编译到JVM。 为什么不能Kotlin? Kotlin中确定子类型是一种限制(我猜,子类化对于Scala来说是不可判定的(Scala有一个图灵完全类型系统),Kotlin可能需要像C#这样的可判定的子类型。 更新后由@erokhins回答( https://stackoverflow.com/a/43807444/7964561 ): 当支持Java禁止的某些东西时,会遇到一些微妙的问题,尤其是在Java互操作性方面。 挖掘scalac生成的字节码时,我发现一个有趣的问题。 我修改演示中的Scala代码如下: trait A trait B […]

Kotlin:消除List中的空值(或其他功能转换)

问题 在Kotlin型系统中解决这种零安全限制的惯用方法是什么? val strs1:List<String?> = listOf("hello", null, "world") // ERROR: Type Inference Failed: Expected Type Mismatch: // required: List<String> // round: List<String?> val strs2:List<String> = strs1.filter { it != null } 这个问题不仅仅是消除空值,而且是为了使类型系统认识到通过转换从集合中删除了空值。 我不想循环,但如果这是最好的办法。 变通 以下编译,但我不知道这是做到这一点的最好方法: fun <T> notNullList(list: List<T?>):List<T> { val accumulator:MutableList<T> = mutableListOf() for (element in list) { if (element != null) { accumulator.add(element) […]

我如何知道Kotlin的推断类型?

(我使用Kotlin 1.1.2-2) 例如,如何知道表达式的推断类型if (boolean_value) 1 else 2.0 ? kotlinc-jvm不显示类型。 javaClass也没有帮助,因为它显示计算值的类型而不是表达式。 >>> (if (true) 1 else 2.0).javaClass.name java.lang.Integer >>> (if (false) 1 else 2.0).javaClass.name java.lang.Double >>> val v: Double = if (false) 1 else 2.0 error: the integer literal does not conform to the expected type Double val v: Double = if (false) 1 else 2.0 […]

与Kotlin泛型混淆

我是Kotlin的新手,我正在尝试编写一些相当简单的代码,但我无法弄清楚如何使用泛型来实现它。 我有一个Handler特点,代表事物的处理程序。 我不能更改处理程序的代码,因为它来自库 。 trait Handler<T> { fun handle(result: T) } 下面的所有代码都在我的控制之下 – User是具有诸如AdminUser和GuestUser等子类的公开类。 一个名为AdminUserAction的特性可以创建一个AdminUser列表,然后将列表传递给List<AdminUser>一个处理器。 trait AdminUserAction { fun then(handler: Handler<List<AdminUser>>) } 现在我想为AdminUserAction传递一个AdminUserAction处理程序,而不是AdminUser 。 假设处理程序只记录用户的名字,并且不对管理员指定的属性做任何事情。 fun doIt(action: AdminUserAction, printAllNames: Handler<List<User>>) { action.then(printAllNames) } 但是,这段代码给了我一个TypeMismatch 。 由于处理程序的类型是List<T>并且是不可变的,所以前面的代码应该是完全安全的,但编译器无法解决这个问题。 如果我可以访问处理程序的代码,我可以做到以下几点,它会工作 – trait Handler<in T> { fun handle(result: T) } 但是,正如我之前所说,我不能修改Handler,因为它来自一个库。 此外,似乎很难做到这一点,因为处理程序的类型是完全一般的,应该也可以用于其他类型的处理程序。 我试过继承Handler并使用它 – trait ListHandler<in T>: Handler<List<T>> { […]

如何在Kotlin中使用递归类型

我想要做的是这样的事情 fun <F, A, R> recur(f: (F, A) -> R, arg: A): R = f(f, arg) where F = (F, A) -> R 如何在Kotlin中输入这个函数?