小编s1m*_*nw1的帖子

Kotlin:"val someVar = if(xx)1 else 1.0",为什么someVar是"Any"?

首先,我试过:

interface Super
class A : Super
class B : Super

val a = if (System.currentTimeMillis() >= 100) A() else B()
Run Code Online (Sandbox Code Playgroud)

我按下Ctrl Q检查的类型a.它的Super,符合市场预期.

但当我尝试时:

val someVar = if (System.currentTimeMillis() > 0) 1 else 1.0
Run Code Online (Sandbox Code Playgroud)

它说someVar是一个Any.不应该是一个Number

inheritance types casting kotlin

3
推荐指数
1
解决办法
66
查看次数

Kotlin演员与演员沟通

一个演员可以发送一条消息actor.send()或者actor.offer() 一旦我的演员从其频道收到消息我想要返回一个回复.我该怎么做呢?我没有看到任何明显的内置方法.

actor kotlin kotlinx.coroutines

3
推荐指数
1
解决办法
827
查看次数

春季MVC Thymeleaf Kotlin

我正在尝试将表单传递给控制器​​,但对象为空(看起来像从默认构造函数而不是从表单获取值)。而且不知道为什么@Valid不起作用。

码:

终点

    @PostMapping("/add") 
fun addDevice(@Valid @ModelAttribute device: Device, model: ModelMap): ModelAndView {
    deviceRepository.save(device)
    return ModelAndView("redirect:/devices/all", model)
}
Run Code Online (Sandbox Code Playgroud)

实体:

@Entity
data class Device(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Int? = null,
        @NotNull
        val name: String? = "",
        @Min(10)
        @Max(30)
        val price: Int? = null,
        @Size(min = 8)
        val secretPhrase: String? = ""
) : Serializable
Run Code Online (Sandbox Code Playgroud)

形成

<h1>Add Device</h1>
    <!--/*@thymesVar id="device" type="com.example.demo.Device"*/-->
    <form action="#" th:action="@{/devices/add}" th:object="${device}" th:method="post">
        <div class="col-md-12">
            <label>Name Cannot Be Null</label>
            <input type="text" minlength="1" th:field="*{name}"></input>
        </div> …
Run Code Online (Sandbox Code Playgroud)

model-view-controller spring kotlin thymeleaf

3
推荐指数
1
解决办法
960
查看次数

Kotlin中的密封类,类型不兼容错误

我有以下Kotlin代码。一个密封的类称为Animal,还有两个对象类,DogCat从该密封的类继承Animal。我when在is Cat案例的子句中收到此错误。

Incompatible types: Cat and Dog
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?如何在Kotlin中使用密封类进行此类操作?密封类是进行多态性的好选择吗?

sealed class Animal {
  abstract fun speak()
}

object Dog : Animal() {
    override fun speak() { println("woof") }
}

object Cat : Animal() {
    override fun speak() { println("meow") }
}

fun main(args: Array<String>) {
    var i = Dog
    i.speak()
    when(i) {
        is Dog -> {
            print("Dog: ")
            i.speak()
        }
        is Cat -> {
            print("Cat: ")
            i.speak()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

kotlin sealed-class

3
推荐指数
1
解决办法
567
查看次数

Kotlin 上限:`:Any` 对 Kotlin 的泛型类型推断有什么影响?

Kotlin for Android Developers本书中,我们遇到的扩展功能

fun <T:Any> SelectQueryBuilder.parseList(parser: (Map<String,Any?>) -> T):List<T> = parseList(object:MapRowParser<T>{
    override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
})
Run Code Online (Sandbox Code Playgroud)

而且我不确定为什么这:Any是必要的。

如果我把它写成fun <T> SelectQueryBuilder.parseList(...),Android Studio 会抱怨

错误信息

而当您添加:Any后,该错误就会消失。

现在,就我而言,T应该暗示T:Any,尽管显然情况并非如此。这是为什么?它有什么区别?

generics android types type-inference kotlin

3
推荐指数
1
解决办法
553
查看次数

使用 gradle kotlin-dsl 覆盖 spring boot 依赖版本

SpringBoot 带有许多依赖项以及它们的默认版本。在 groovy-gradle 中,这样的依赖版本可以被覆盖:

ext['mockito.version'] = '1.7.5'
Run Code Online (Sandbox Code Playgroud)

但这对 kotlin-dsl 不起作用。我试过:

val mockito by extra { "2.12.0" }
val mockito.version by extra { "2.12.0" }
val `mockito.version` by extra { "2.12.0" }
Run Code Online (Sandbox Code Playgroud)

后两个,不要编译,第一个,不起作用。

如何在 kotlin 文件中覆盖版本(如果可能的话,我不想创建单独的属性文件)。

gradle kotlin gradle-kotlin-dsl

2
推荐指数
1
解决办法
679
查看次数

Kotlin:具体化的类型参数使 Gson 失败

我在具有reified类型的函数中使用 Gson 反序列化时遇到了一个奇怪的行为。它仅在interfaces涉及类型参数时发生。

取以下代码:

val toBeSerialized = listOf("1337")
with(Gson()) {
    val ser = toJson(toBeSerialized)
    val deser = fromJson<List<Serializable>>(ser)
}
Run Code Online (Sandbox Code Playgroud)

第 4 行使用了自定义扩展函数Gson.fromJson(json: String): T

如果定义为具体化,则失败T

inline fun <reified T> Gson.fromJson(json: String): T = fromJson<T>(json, object : TypeToken<T>() {}.type)
Run Code Online (Sandbox Code Playgroud)

如果它被定义为普通类型参数,它就可以工作

fun <T> Gson.fromJson(json: String): T = fromJson<T>(json, object : TypeToken<T>() {}.type)
Run Code Online (Sandbox Code Playgroud)

(注意T这里make reified没有意义,只是想了解它在特殊用例中的影响)

使用时的异常reified如下所示:

Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for ? …
Run Code Online (Sandbox Code Playgroud)

java gson kotlin

2
推荐指数
1
解决办法
1688
查看次数

不满意:推断为T型?不是Any的子类型

为了映射结果,我实现了密封的泛型类:

public sealed class ResultMapper<out T : Any> {
    public class Ok<out T : Any>(public val value: T,
                            override val response: Response) : Result<T>(), ResponseResult {
        override fun toString(): String = "Result.Ok{value=$value, response=$response}"
    }
}

   public interface ResponseResult {
     val response: Response
   } 
Run Code Online (Sandbox Code Playgroud)

现在,我假设该类应该按预期的方式工作:

 ResultMapper.Ok(body,raw)

private class Body<T>() {
  onResponse(response: Response, raw: Raw) {
   ResultMapper.Ok(response.body(),response.raw()) --> It returned an exception
  }
}
Run Code Online (Sandbox Code Playgroud)

构造函数Ok不满意:推断类型T?不是Any的子类型

generics bounds kotlin kotlin-android-extensions

2
推荐指数
1
解决办法
3229
查看次数

未解决参考:toUpperCase Kotlin

我目前正在 Android Studio 3.1 中使用 JsonReader 开发 Kotlin,我收到一个String!,我正在尝试将其转换为大写,所以我所做的是:

var name=reader.nextString().toUpperCase()
Run Code Online (Sandbox Code Playgroud)

问题是,toUpperCase未检测到并被标记为未解决的参考

android kotlin

2
推荐指数
1
解决办法
7223
查看次数

按值的日期属性对 Hashmap 键进行排序

我有:

var schedulesByMonth = HashMap<String, MutableList<Schedule>>()
Run Code Online (Sandbox Code Playgroud)

Schedule 有一个startDate: Date属性。

我从一个巨大的Schedule对象列表开始,并按月将它们分类到哈希图中。因此,如果 Schedule 对象上的 startDate 是 2018 年 6 月,它将进入 key 的列表June 2018

这一切都很好,但我需要按月正确排序的选择器的键:

schedulesByMonth.keys
Run Code Online (Sandbox Code Playgroud)

如果那个数组是["July 2018", "August 2018", "June 2018"]我需要的["June 2018", "July 2018", "August 2018"]

我知道我可以制作一个 sortedMap:

val sorted = schedulesByMonth.toSortedMap(compareBy<String> {

    }
Run Code Online (Sandbox Code Playgroud)

但这仅对键 ( String) 进行排序。我怎样才能it成为值 ( MutableList<Schedule>) 以便我可以按startDate其中一个时间表排序?

android sortedmap kotlin

2
推荐指数
1
解决办法
1777
查看次数