首先,我试过:
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?
一个演员可以发送一条消息actor.send()或者actor.offer()
一旦我的演员从其频道收到消息我想要返回一个回复.我该怎么做呢?我没有看到任何明显的内置方法.
我正在尝试将表单传递给控制器,但对象为空(看起来像从默认构造函数而不是从表单获取值)。而且不知道为什么@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) 我有以下Kotlin代码。一个密封的类称为Animal,还有两个对象类,Dog并Cat从该密封的类继承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 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,尽管显然情况并非如此。这是为什么?它有什么区别?
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 文件中覆盖版本(如果可能的话,我不想创建单独的属性文件)。
我在具有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) 为了映射结果,我实现了密封的泛型类:
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的子类型
我目前正在 Android Studio 3.1 中使用 JsonReader 开发 Kotlin,我收到一个String!,我正在尝试将其转换为大写,所以我所做的是:
var name=reader.nextString().toUpperCase()
Run Code Online (Sandbox Code Playgroud)
问题是,toUpperCase未检测到并被标记为未解决的参考
我有:
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其中一个时间表排序?